【问题标题】:How can I pass a block/proc and variable directly to a function?如何将块/过程和变量直接传递给函数?
【发布时间】:2013-06-15 07:57:08
【问题描述】:

我正在尝试学习积木和触发,我觉得这应该是可行的,但到目前为止我还没有成功。

我想要什么:

def main_action(generic_variable, block)
 generic_variable += 1 # I do more interesting stuff than this in my version
 yield(generic_variable)
end

main_action(3, {|num| num + 5 })

或类似的东西。

我找到的最接近的是http://mudge.name/2011/01/26/passing-blocks-in-ruby-without-block.html,这似乎需要创建一个传递方法来发送块:

class Monkey

  # Monkey.tell_ape { "ook!" }
  # ape: ook!
  #  => nil
  def self.tell_ape(&block)
    tell("ape", &block)
  end

  def self.tell(name, &block)
    puts "#{name}: #{block.call}"
  end
end

如果我使用在我的代码中设置的相同传递方法,我可以让它工作,但它似乎是不必要的代码。我尝试直接调用Monkey.tell("ape", { "ook!" }),但得到syntax error, unexpected '}', expecting tASSOC

是否可以在一次调用中将变量和块(或 proc,我不挑剔)发送到函数?另外,如果你有时间,上面发生了什么?为什么这不起作用?

【问题讨论】:

  • 什么是“一次通话”?
  • 在一个函数调用中 - 如,不经过tell_ape 步骤,直接执行。

标签: ruby variables block proc


【解决方案1】:

你似乎混淆了方块和触发。块不是红宝石对象。你不能像这样通过它

foo(args, block)

通过它的唯一方法是foo(args){...}foo(args) do ... end。但是,在方法定义中,您可以接收一个块,将其转换为 proc,并接受它作为它的参数之一,如下所示:

def foo(args, &block)
  ...
end

另一方面,您可以将 proc 对象作为参数传递,例如

foo(args, proc)

创建 proc 对象有多种方法,接近块字面量的字面量是 lambda:->{...},但它不同于块语法 {...}。使用这个,你可以做到

foo(args, ->{...})

但不是

foo(args, {...})

除非{...} 是一个哈希。

【讨论】:

    【解决方案2】:

    基于sawa's answer,我能够使用块和过程重新创建问题中的函数(Monkey.tell)。在这里,以防其他人发现它们有用!

    def tell_proc(name, proc)
      puts "#{name}: #{proc.call('ook')}"
    end
    tell_proc('ape', ->(sound) { sound + "!" })
    
    def tell_block(name, &block)
      puts "#{name}: #{block.call('ook')}"
    end
    tell_block('ape') {|sound| sound + "!" }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-08-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-20
      • 2011-06-21
      • 2020-03-29
      • 2013-07-04
      相关资源
      最近更新 更多