Ruby 重新定义的方法,并没有给出块
有人能解释一下,为什么最后一个元老扔了一个“不给”的方块吗Ruby 重新定义的方法,并没有给出块,ruby,exception,yield,Ruby,Exception,Yield,有人能解释一下,为什么最后一个元老扔了一个“不给”的方块吗 class Foo def yielder yield "hello" end end class Mod def initialize @@foo = Foo.new end def self.foo @@foo end end worker = Mod.new Mod.foo.yielder do |hello| puts hello end Mod.foo.clas
class Foo
def yielder
yield "hello"
end
end
class Mod
def initialize
@@foo = Foo.new
end
def self.foo
@@foo
end
end
worker = Mod.new
Mod.foo.yielder do |hello|
puts hello
end
Mod.foo.class.send(:define_method,:yielder) do
yield "new hello"
end
Mod.foo.yielder do |hello|
puts hello
end
给出:
你好test.rb:27:in‘block in’:没有给出块(产量)(LocalJumpError)
来自测试。rb:30:in`' 简短介绍: 如果在
initialize
外部定义@foo,则不需要Mod实例
您不需要Mod类来解决问题:
class Foo
def yielder
p 2
yield "hello"
end
end
foo = Foo.new
foo.yielder do |hello|
puts hello
end
foo.class.send(:define_method,:yielder) do
p 1
yield "new hello"
end
foo.yielder do |hello|
puts hello
end
您可以再次缩短示例:
class Foo
end
foo = Foo.new
foo.class.send(:define_method,:yielder) do
yield "new hello"
end
foo.yielder do |hello|
puts hello
end
这与:
class Foo
define_method(:yielder) do
yield "new hello"
end
end
foo = Foo.new
foo.yielder do |hello|
puts hello
end
导言结束
现在,我不确定我是否理解了您想要的内容(以及我是否理解ruby correct;)
define_method
接受块并将其用作方法体。
如果新方法应自行接收块,则必须在定义的接口中定义并调用它:
class Foo
define_method(:yielder) do | &prc |
prc.call("new hello")
end
end
foo = Foo.new
foo.yielder do |hello|
puts hello
end
或者与您的示例中的逻辑相同:
class Foo
def yielder
yield "hello"
end
end
class Mod
def initialize
@@foo = Foo.new
end
def self.foo
@@foo
end
end
worker = Mod.new
Mod.foo.yielder do |hello|
puts hello
end
Mod.foo.class.send(:define_method,:yielder) do | &prc |
prc.call "new hello"
end
Mod.foo.yielder do |hello|
puts hello
end
为了使代码更加健壮,我建议使用block\u given?
进行一些检查,简单介绍一下:
如果在initialize
外部定义@foo,则不需要Mod实例
您不需要Mod类来解决问题:
class Foo
def yielder
p 2
yield "hello"
end
end
foo = Foo.new
foo.yielder do |hello|
puts hello
end
foo.class.send(:define_method,:yielder) do
p 1
yield "new hello"
end
foo.yielder do |hello|
puts hello
end
您可以再次缩短示例:
class Foo
end
foo = Foo.new
foo.class.send(:define_method,:yielder) do
yield "new hello"
end
foo.yielder do |hello|
puts hello
end
这与:
class Foo
define_method(:yielder) do
yield "new hello"
end
end
foo = Foo.new
foo.yielder do |hello|
puts hello
end
导言结束
现在,我不确定我是否理解了您想要的内容(以及我是否理解ruby correct;)
define_method
接受块并将其用作方法体。
如果新方法应自行接收块,则必须在定义的接口中定义并调用它:
class Foo
define_method(:yielder) do | &prc |
prc.call("new hello")
end
end
foo = Foo.new
foo.yielder do |hello|
puts hello
end
或者与您的示例中的逻辑相同:
class Foo
def yielder
yield "hello"
end
end
class Mod
def initialize
@@foo = Foo.new
end
def self.foo
@@foo
end
end
worker = Mod.new
Mod.foo.yielder do |hello|
puts hello
end
Mod.foo.class.send(:define_method,:yielder) do | &prc |
prc.call "new hello"
end
Mod.foo.yielder do |hello|
puts hello
end
为了使代码更加健壮,我建议使用
block\u given?
进行一些检查,这与define\u方法使用instance\u eval
有关,因为如果使用class\u eval
和字符串进行检查,则效果良好,而instance\u eval
会给出相同的错误。但是仍然没有看到它:/这与定义方法
对实例评估
的使用有关,因为如果使用类评估
和字符串的老式方法进行操作,它工作正常,而实例评估
给出相同的错误。但仍然看不到它:/归根结底,发送define_method
不允许相同的隐式块方法签名。现实世界中的使用需要它有时失败的方式。因此这个问题,但非常感谢您精心准备的答案。哦,这也给rspec带来了麻烦。我打赌这个案例对rspec维护者来说很有趣,我将把它作为一个问题提交给您,并提供一个很好的示例。我还提交了一个关于ruby本身的问题,这里有一个链接。问题链接:这是一个respec问题,现在已经解决了,谢谢!Mod.foo.should_receive(:some_method)。一旦do |&prc | prc.call“whatever”endIt归结为发送define_方法
不允许相同的隐式块方法签名。现实世界的使用需要它有时失败的方式。因此这个问题,但非常感谢您精心准备的答案。哦,这也给rspec带来了麻烦。我打赌这个案例对rspec维护者来说很有趣,我将把它作为一个问题提交给您,并提供一个很好的示例。我还提交了一个关于ruby本身的问题,这里有一个链接。问题链接:这是一个respec问题,现在已经解决了,谢谢!Mod.foo.should_receive(:some_method)。一旦做了|&prc | prc。称“无论什么”结束