Всем привет!
Сегодня расскажу про метод delegate в RubyOnRails.
Его назначение: позволяет вызывать методы других объектов как свои собственные.
Использовать его просто:
delegate [один или несколько методов], to: => [целевой класс]
[один или несколько методов] - названия методов из целевого класса.
Имена методов записываются как символы или как строки. Несколько методов разделяются запятой.
Пример: :hello, :goodbye, :start, :end
Сегодня расскажу про метод delegate в RubyOnRails.
Его назначение: позволяет вызывать методы других объектов как свои собственные.
Использовать его просто:
delegate [один или несколько методов], to: => [целевой класс]
[один или несколько методов] - названия методов из целевого класса.
Имена методов записываются как символы или как строки. Несколько методов разделяются запятой.
Пример: :hello, :goodbye, :start, :end
[целевой класс] - название имени класса в который будут делегироваться запросы на вызов метода.
Пример кода:
Есть класс Greeter
class Greeter < ActiveRecord::Base
def hello() "hello" end
def goodbye() "goodbye" end
end
Мы хотим в классе Foo делегировать вызов метода hello классу Greeter
class Foo < ActiveRecord::Base
belongs_to :greeter
delegate :hello, :to => :greeter
end
Тогда вызывая у объекта класса Foo метод hello получим:
Foo.new.hello # => "hello"
Если попытаемся вызвать другой метод класса Greeter - goodbye, то получим ошибку.
Foo.new.goodbye # => NoMethodError: undefined method `goodbye' for #<Foo:0x1af30c>
class Greeter < ActiveRecord::Base
def hello() "hello" end
def goodbye() "goodbye" end
end
Мы хотим в классе Foo делегировать вызов метода hello классу Greeter
class Foo < ActiveRecord::Base
belongs_to :greeter
delegate :hello, :to => :greeter
end
Тогда вызывая у объекта класса Foo метод hello получим:
Foo.new.hello # => "hello"
Если попытаемся вызвать другой метод класса Greeter - goodbye, то получим ошибку.
Foo.new.goodbye # => NoMethodError: undefined method `goodbye' for #<Foo:0x1af30c>
Это только один из способов использования delegate.
Спасибо за внимание.
Удачи.
Комментариев нет:
Отправить комментарий