class SomeClass
def initialize
yield
end
def test
puts 'test'
end
end
当我初始化一些SomeClass时,我想在块内执行测试函数。 SomeClass.new {test()} 这给了我
NoMethodError: undefined method `test' for main:Object
答案 0 :(得分:3)
您正在寻找instance_eval
:
class SomeClass
def initialize(&block)
instance_eval(&block) if block_given?
end
def test
puts 'test'
end
end
SomeClass.new { test() } #=> test
答案 1 :(得分:3)
这很简单,只需通过self
:
class SomeClass
def initialize
yield self if block_given?
end
def test
puts 'test'
end
end
SomeClass.new { |ob| ob.test }
# >> test
你的那个没有用,因为块是关闭的,并且self
在你的例子中的块内设置为main
。 main
是Object
的一个实例。您没有违反#test
内的Object
,因此main
会尝试拨打#test
,但您收到了真正的错误。
答案 2 :(得分:2)
或者您可以使用呼叫,如下所示:
class SomeClass
def initialize(&block)
block.call(self) if block_given?
end
def test
puts 'test'
end
end
SomeClass.new {|s| s.test }
答案 3 :(得分:0)
两种解决方案:
class SomeClass
def initialize(&block)
instance_eval(&block)
end
def test
puts 'test'
end
end
SomeClass.new { test() } #=> test
class SomeClass
def initialize
yield self
end
def test
puts 'test'
end
end
SomeClass.new {|o| o.test() } #=> test
有些参考资料希望对您有所帮助:
1.instance_eval不再在ruby 1.9中产生自我:https://www.ruby-forum.com/topic/189422
2.如何使用yield和instance_eval构建DSL?:http://rubylearning.com/blog/2010/11/30/how-do-i-build-dsls-with-yield-and-instance_eval/