【问题标题】:Ruby: passing blocks as parameters from oustide classRuby:将块作为参数从外部类传递
【发布时间】:2017-11-20 09:02:08
【问题描述】:

执行代码时出现以下错误:

example.rb:9:in `<main>': undefined method `each' for main:Object (NoMethodError)

第 9 行是我代码中的倒数第二行。

我的代码:

class TargetProvider
  def each(target,&block)
    block.call(target)
  end   
end

tp = TargetProvider.new
each { puts "Hello!" }
tp.each(1, each)

我的动机是使用目标参数调用块。

我怎样才能在课外传递一个块。请帮忙。

【问题讨论】:

    标签: ruby ruby-block


    【解决方案1】:

    这是你的代码:

    class TargetProvider
      def each(target,&block)
        block.call(target)
      end   
    end
    
    tp = TargetProvider.new
    each { puts "Hello!" } # this line is trying to run a method called each
    tp.each(1, each)
    

    您需要定义一个 lambda 或 proc 并将其存储在一个变量中,或者使用 each 的隐式块。 这是一个使用 lambda 的示例:

    class TargetProvider
      def each(target,&block)
        block.call(target)
      end   
    end
    
    tp = TargetProvider.new
    each_block = lambda { |a| puts "Hello!" }
    tp.each(1, &each_block)
    

    这是一个使用隐式块的例子:

    class TargetProvider
      def each(target,&block)
        block.call(target)
      end   
    end
    
    tp = TargetProvider.new
    each_block = lambda { |a| puts "Hello!" }
    tp.each(1) { puts "Hello!" }
    

    【讨论】:

      【解决方案2】:

      好吧,问题就在这里:

      tp = TargetProvider.new
      each { puts "Hello!" } # Here
      tp.each(1, each)
      

      在这里,您调用 each 方法,而不是声明一个新变量。 在 Ruby 中,如果您调用一个方法而不指定其对象(通过object.method),解释器会在MainObject 中搜索该方法。

      很明显里面没有这样的方法,所以这就是错误的意思。

      你可能想要达到的效果是这样的:

      tp = TargetProvider.new
      tp.each(1) { puts "Hello!" }
      

      该代码调用TargetProvidereach 方法并传递一个块。

      【讨论】:

      • "在 Ruby 中,如果你调用一个方法而不指定它的对象(通过object.method),解释器会在MainObject 中搜索那个方法。" – 不。隐式接收者是self,而不是MainObject(不管是什么。)
      • @JörgWMittag 在顶级上下文中,任何类之外的self 是什么?没错,它是 main 对象,在 irb 中查看。
      猜你喜欢
      • 2016-02-27
      • 1970-01-01
      • 2021-05-05
      • 1970-01-01
      • 1970-01-01
      • 2015-04-07
      • 1970-01-01
      • 2011-01-28
      • 1970-01-01
      相关资源
      最近更新 更多