Aby lepiej zrozumieć, w jaki sposób można osiągnąć to, co chcesz, spójrz na poniższym przykładzie:
module PrintingModule
def self.included(object)
object.extend(ClassMethods)
end
module ClassMethods
def class_method_of_class
puts "I am class #{self.name}"
end
end
def instance_method_of_class
puts "My name is: #{@name}"
end
class << self
def static_module_method
puts "Printer version 1.0"
end
end
end
class SomeObject
include PrintingModule
def initialize(name)
@name = name
end
end
object = SomeObject.new("Something")
object.instance_method_of_class
SomeObject.class_method_of_class
PrintingModule.static_module_method
mam nadzieję, że jest to bardziej oczywiste, teraz, trzeba pamiętać, że jest to tylko jeden z możliwych sposobów (są inne)
UPDATE: Postaram się być bardziej szczegółowy. Kiedy definiujesz metody instancji/singleton w module, to tak naprawdę to, że definiujesz metody instancji klasy, które będą zawierały ten moduł, a z drugiej strony, metody klasy zdefiniowane w module staną się metodami klasy tego modułu. Druga myśl polega na tym, że attr_accessor tworzy metodę instancji dla gettera i ustawiającego dla danego parametru.
Teraz, aby odpowiedzieć na jedną część pytania, w pierwszym przykładzie tworzysz 3 klasy metod w klasie modułu. W drugim tworzysz metodę 1-klasową, w której próbujesz uzyskać dostęp do innej metody klasy (setter), ale twoje pobierające i ustawiające są zdefiniowane jako metody instancji = staną się instancją metody klasy, która będzie zawierać twój moduł, nie można się do nich dostać w ten sposób = nie masz dostępu do swoich pobierających i ustawiających. Co do wyjaśnienia siebie, cóż, nie jestem tak utalentowany, ale o ile wiem, kiedy używasz "class < < self", otwierasz eigenclass (każdy obiekt ma swój własny anonimowy) obiektu (zauważ że Klasa, moduły lub instancje klas są oczywiście obiektami), w których definiujesz metody instancji. Metoda klas obiektu w Ruby = metoda instancji obiektu obiektu. Więc można to zrobić na przykład:
text = "something"
class << text
def say_hi
puts "Hi!"
end
end
text.say_hi
Podczas tworzenia instancji klasy (string w tym przykładzie), że instancja dostaje swój własny niepowtarzalny anonimowy klasy, która jest podklasą tej klasy. W tym przykładzie zdefiniowano metodę instancji w elemencie podklasy anonimowej klasy String. Możesz więc użyć metody "say_hi" na obiekcie tekstowym, ale nie w klasie String. Tak więc "klasa < < self" otwiera te eigenclasses.
Z drugiej strony samo "samo" reprezentuje obiekt w bieżącym kontekście, co oznacza to samo w niektórych scenariuszach (na przykład w twoim). Jeśli chodzi o metodę self.included, jest to po prostu metoda wywołania zwrotnego, która jest wywoływana, gdy moduł jest zawarty w klasie z parametrem reprezentującym obiekt (tutaj klasa SomeObject).
Mam nadzieję, że odpowiedziałem na przynajmniej część Twojego pytania. Więcej informacji tutaj: Difference between 'self.method_name' and 'class << self' in Ruby
Jeśli naprawdę chcesz dowiedzieć się szczegółów Ruby metaprogramowanie, polecam [metaprogramowanie Ruby książki Paolo Perrotta] (http://pragprog.com/book/ppmetr/metaprogramming-ruby) . – sarnold