Ruby:LocalJumpError 错误:代码:

为什么会出现错误:

错误:

LocalJumpError
# ~> no block given (yield)

代码:

module M
  def hello(text = 'bba')
    puts "yo-#{text}"      # => nil
  end                      # => :hello

  instance_methods  # => [:hello]

  m = instance_method(:hello)  # => #<UnboundMethod: M#hello>

  define_method(:bye) do |*args,&block|  
    yield                                 # ~> LocalJumpError: no block given (yield)
    m.bind(self).(*args,&block)
  end                                     # => :bye

end  # => :bye

class A
  include M  # => A
end          # => A


A.new.hello('vv')       # => nil
A.new.bye('zz') do |p|  # => #<A:0x00007fa8c401e090>
  puts "ggg"
end

# >> yo-vv

# ~> LocalJumpError
# ~> no block given (yield)
z979581569 回答:Ruby:LocalJumpError 错误:代码:

这是#By default,disable all usb devices (including hubs) ACTION=="add",SUBSYSTEMS=="usb",RUN+="/bin/sh -c 'for host in /sys/bus/usb/devices/usb*; do echo 0 > $host/authorized_default; done'" #Enable hub devices ACTION=="add",ATTR{bDeviceClass}=="09",RUN+="/bin/sh -c 'echo 1 >/sys$DEVPATH/authorized'" #Enable desired USB devices by setting PID/VID ACTION=="add",ATTR{idVendor}=="045e",ATTR{idProduct}=="07f8",RUN+="/bin/sh -c 'echo 1 >/sys$DEVPATH/authorized'" ACTION=="add",ATTR{idProduct}=="0797",RUN+="/bin/sh -c 'echo 1 >/sys$DEVPATH/authorized'" def语义上的区别。看到这个:

define_method

module M def outer(&block) puts "outer: #{yield}" def inner1 puts "inner1: #{yield}" end M.define_method(:inner2) do puts "inner2: #{yield}" end M.define_method(:inner3) do |&block| puts "inner3: #{block.call}" end inner1 { 1 } inner2 { 2 } inner3 { 3 } end end class A include M end A.new.outer { 0 } # => outer: 0 # inner1: 1 # inner2: 0 (!!!) # inner3: 3 仅在yield内部有效。

因此,def调用了自己的块;但是inner1使用它所在的inner2的块。调用def内部的块的正确方法是将其捕获到参数列表中(就像您所做的一样),然后使用define_method#call上的内容,例如#[]的演示。

在您的代码中,周围没有inner3,因此当您def时没有块可用。您可以使用上述方法,并将yield替换为yield

本文链接:https://www.f2er.com/3140221.html

大家都在问