Oto wyjaśnienie:
Od ruby docs.
Moduł to zbiór metod i stałych. Metody w module mogą być przykładowymi metodami lub metodami modułu. Metody instancji pojawiają się jako metody w klasie, gdy moduł jest włączony, metody modułów nie. Odwrotnie, metody modułów mogą być wywoływane bez tworzenia obiektu enkapsulacji, podczas gdy metody instancji mogą nie być. (Patrz Module # module_function.)
self.methodname
wewnątrz moduł tworzy metodę modułu.
W tym przypadku podczas wywoływania M::helper
faktycznie robisz M.helper
, gdy patrzysz na to z punktu widzenia programisty C++. Odbiornikiem jest moduł Module (instancja modułu typu Ruby Module) w tym przypadku.
Inny sposób, aby patrząc na to, aby zrozumieć koncepcję odbiornika, każde połączenie metoda składa się z odbiornika i metoda nazwie (+ ewentualnie params i bloku kodu). Odbiornikiem może być Module object
, Class object
lub instancja klasy zdefiniowanej przez użytkownika.
Można wywoływać tylko metody modułu (lub klasy) na obiekcie modułu (lub klasy). Możesz wywołać dowolną metodę (moduł/klasę/instancję) na instancji.
Jeśli chcesz wywołać metodę instancji zdefiniowaną w module, musisz nadać jej odbiornik przez including
ten moduł w jakiejś klasie i utworzyć jego instancję.
Więc w tym przypadku Innym rozwiązaniem może być:
module MM
def helper(param)
puts "hello #{param}"
end
class ReceiverClass
include MM # add helper() to ReceiverClass
end
class C < Struct.new(:param)
def work
ReceiverClass.new.helper(param)
end
end
end
c = MM::C.new("world")
c.work
dzięki za wyjaśnienie różnicy między używaniem siebie. i w tym module. –