Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 重新定义的方法,并没有给出块_Ruby_Exception_Yield - Fatal编程技术网

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。称“无论什么”结束