При наследовании от Module
вы можете передать блок super()
, и он будет выполнен:
class Foo < Module
def initialize
super() do
# do some other stuff...
end
end
end
Зачем использовать это вместо простого вызова super()
без блока, после чего следуетостальная часть кода, такая как:
class Foo < Module
def initialize
super()
# do some other stuff...
end
end
Менее надуманный пример будет:
class QuestionAttr < Module
def initialize(method_name)
super() do
define_method "#{method_name}?" do
!!public_send(method_name)
end
end
end
end
Fruit = Struct.new(:colour) do
include QuestionAttr.new(:colour)
end
fruit = Fruit.new('red')
fruit.colour? # => true
Почему я define_method
внутри блока перешел к super()
, каксогласно приведенному выше примеру, вместо того, чтобы пропускать блок, переданный super()
и define_method
впоследствии.