Ruby 如果没有类,如何调用类方法?
我有一个家庭作业必须完成类似的任务:Ruby 如果没有类,如何调用类方法?,ruby,Ruby,我有一个家庭作业必须完成类似的任务: module Foo def self.bar yield end def helper (number) p number end end Foo.bar do helper 5 end 这当然会给出一个错误,因为对象中没有定义“helper”。但在任务中,它直截了当地指出,必须以这种方式使用Foo: Foo.bar do helper 5 end 但它并没有说明“helper”是在哪里定义的。如何像上面
module Foo
def self.bar
yield
end
def helper (number)
p number
end
end
Foo.bar do
helper 5
end
这当然会给出一个错误,因为对象中没有定义“helper”。但在任务中,它直截了当地指出,必须以这种方式使用Foo:
Foo.bar do
helper 5
end
但它并没有说明“helper”是在哪里定义的。如何像上面这样调用此方法?编写如下代码:
module Foo
def self.bar
yield
end
end
def helper (number)
p number
end
Foo.bar do
helper 5
end
将方法helper
置于顶层。然后helper
将成为类对象的私有实例方法。您正在将一个块传递给调用Foo.bar
,并且该块作为闭包,可以访问其周围环境。因此,helper 5
将被main
顶级Object
类实例隐式调用。现在代码可以工作了
另一种方法是使用顶层的方法将Foo
模块包含到类对象中
module Foo
def self.bar
yield
end
def helper (number)
p number
end
end
# this will make available `helper` method as an instance method to the Object class.
include Foo
Foo.bar do
helper 5
end
编写如下代码:
module Foo
def self.bar
yield
end
end
def helper (number)
p number
end
Foo.bar do
helper 5
end
将方法helper
置于顶层。然后helper
将成为类对象的私有实例方法。您正在将一个块传递给调用Foo.bar
,并且该块作为闭包,可以访问其周围环境。因此,helper 5
将被main
顶级Object
类实例隐式调用。现在代码可以工作了
另一种方法是使用顶层的方法将Foo
模块包含到类对象中
module Foo
def self.bar
yield
end
def helper (number)
p number
end
end
# this will make available `helper` method as an instance method to the Object class.
include Foo
Foo.bar do
helper 5
end
可以使用在对象的上下文中计算块。大概是这样的:
class Foo
def bar(&block)
instance_eval(&block)
end
def helper(number)
p number
end
end
Foo.new.bar do
helper 5
end
您还可以将bar
设置为类方法并调用:
class Foo
def self.bar(&block)
new.instance_eval(&block)
end
# ...
end
Foo.bar { helper 5 }
或返回实例:
class Foo
def self.bar(&block)
new.tap { |foo| foo.instance_eval(&block) }
end
# ...
end
foo = Foo.bar { helper 5 }
可以使用在对象的上下文中计算块。大概是这样的:
class Foo
def bar(&block)
instance_eval(&block)
end
def helper(number)
p number
end
end
Foo.new.bar do
helper 5
end
您还可以将bar
设置为类方法并调用:
class Foo
def self.bar(&block)
new.instance_eval(&block)
end
# ...
end
Foo.bar { helper 5 }
或返回实例:
class Foo
def self.bar(&block)
new.tap { |foo| foo.instance_eval(&block) }
end
# ...
end
foo = Foo.bar { helper 5 }