Доступ метода в Ruby

Есть некоторые проблемы с вашим кодом, но в целом, если вам приходится использовать одни и те же столбцы для поиска различных комбинаций значений, я рекомендую использовать DataFrame.query:

terms = [('BMW', 5), ('VW', 10)]

query = '({})'.format(
    ') or ('.join(f"car == {repr(c)} and price == {p}" for c, p in terms))
query
# "(car == 'BMW' and price == 5) or (car == 'VW' and price == 10)"

df.query(query)

   car  price
1  BMW      5
2   VW     10
3  BMW      5
5   VW     10
9
задан 1 October 2008 в 05:59
поделиться

3 ответа

Определение "homer" метода добавляет метод к Классу объекта. Это не определяет бесплатную функцию.

Леденец класса неявно наследовался Объекту и так имеет доступ к методам в Объекте. То, когда Вы называете "homer" в методе "земли", разрешение метода не может найти определение в текущем классе, переходит к суперклассу, находит метод, который Вы добавили к Объекту, и называет его.

24
ответ дан 4 December 2019 в 06:57
поделиться

Простой способ узнать, что происходит

  1. Какие классы/модули ищутся для разрешения методов, используемых в объектах Candy?

    p Candy.ancestors # => [Леденец, Объект, Ядро]

  2. Леденец имеет метод названным homer?

    p Леденец instance_methods (ложь) .grep ("homer") # => []

    p Леденец private_instance_methods (ложь) .grep ("homer") # => []

  3. Хорошо Леденец не имеет никакого метода названным 'homer'.

  4. Что является следующим в цепочке поиска (см. 1), => "Объект"

  5. Объект имеет метод названным "homer"? p Объект instance_methods (ложь) .grep ("homer") # => []

    p Объект private_instance_methods (ложь) .grep ("homer") # => ["homer"]

Леденец имеет Объект в своей цепочке поиска, которая в свою очередь имеет частный метод экземпляра "homer", таким образом, разрешение метода успешно выполняется

Оператор определения всегда определяет метод в классе любого сам, при определении

  1. Что сам непосредственно перед тем, как homer определяется?

    p сам # => основное определение homer помещает "Привет" конец

  2. Таким образом, каков его тип?

    p self.class # => Объект

Который является, почему homer заканчивается на Объекте

5
ответ дан 4 December 2019 в 06:57
поделиться

Технически, определение homer метод находится на самом деле на Kernel модуль, который смешан в Object, не на Object непосредственно. Итак, когда homer не локальная переменная или метод экземпляра, определенный на Candy, цепочка наследования метода Ruby развита через Object и затем к смешанному - в Kernel модуль и затем этот код выполняются.

Править: Извините, я не знаю, почему я думал это. Кажется, что метод действительно живет на Object. Не уверенный это имеет слишком много значения на практике, но я должен был подтвердить вещи перед регистрацией.

4
ответ дан 4 December 2019 в 06:57
поделиться
Другие вопросы по тегам:

Похожие вопросы: