Есть некоторые проблемы с вашим кодом, но в целом, если вам приходится использовать одни и те же столбцы для поиска различных комбинаций значений, я рекомендую использовать 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
Определение "homer" метода добавляет метод к Классу объекта. Это не определяет бесплатную функцию.
Леденец класса неявно наследовался Объекту и так имеет доступ к методам в Объекте. То, когда Вы называете "homer" в методе "земли", разрешение метода не может найти определение в текущем классе, переходит к суперклассу, находит метод, который Вы добавили к Объекту, и называет его.
Простой способ узнать, что происходит
Какие классы/модули ищутся для разрешения методов, используемых в объектах Candy?
p Candy.ancestors # => [Леденец, Объект, Ядро]
Леденец имеет метод названным homer?
p Леденец instance_methods (ложь) .grep ("homer") # => []
p Леденец private_instance_methods (ложь) .grep ("homer") # => []
Хорошо Леденец не имеет никакого метода названным 'homer'.
Что является следующим в цепочке поиска (см. 1), => "Объект"
Объект имеет метод названным "homer"? p Объект instance_methods (ложь) .grep ("homer") # => []
p Объект private_instance_methods (ложь) .grep ("homer") # => ["homer"]
Леденец имеет Объект в своей цепочке поиска, которая в свою очередь имеет частный метод экземпляра "homer", таким образом, разрешение метода успешно выполняется
Оператор определения всегда определяет метод в классе любого сам, при определении
Что сам непосредственно перед тем, как homer определяется?
p сам # => основное определение homer помещает "Привет" конец
Таким образом, каков его тип?
p self.class # => Объект
Который является, почему homer заканчивается на Объекте
Технически, определение homer
метод находится на самом деле на Kernel
модуль, который смешан в Object
, не на Object
непосредственно. Итак, когда homer
не локальная переменная или метод экземпляра, определенный на Candy
, цепочка наследования метода Ruby развита через Object
и затем к смешанному - в Kernel
модуль и затем этот код выполняются.
Править: Извините, я не знаю, почему я думал это. Кажется, что метод действительно живет на Object
. Не уверенный это имеет слишком много значения на практике, но я должен был подтвердить вещи перед регистрацией.