【问题标题】:Ruby block implicit variablesRuby 块隐式变量
【发布时间】:2014-06-04 12:27:37
【问题描述】:

我想知道 Ruby 是否有类似 Scala 中的隐式块参数或通配符之类的东西,可以像这样绑定并在进一步执行中使用:

my_collection.each { puts _ }

my_collection.each { puts }

proc 有类似符号的东西,它在集合中的每个元素上调用一些方法,例如:array_of_strings.each &:downcase,但我不想在循环中执行对象的方法,而是以这个对象作为参数执行一些函数:

my_collection.each { my_method(_) }

代替:

my_collection.each { |f| my_method(f) }

在 Ruby 中有没有办法做到这一点?

【问题讨论】:

    标签: ruby lambda block


    【解决方案1】:

    你应该可以做到:

    my_collection.each &method(:my_method)
    

    method 是在 Object 类上定义的方法,返回 Method 类的实例。 Method 实例与符号类似,定义了to_proc 方法,因此可以与一元& 运算符一起使用。该操作符接受一个过程或任何定义to_proc 方法的对象,并将其转换为一个块,然后将其传递给一个方法。因此,如果您定义了如下方法:

    def my_method(a,b)
      puts "#{b}: #{a}"
    end
    

    你可以写:

    [1,2,3,4].each.with_index &:method(:my_method)
    

    这将转化为:

    [1,2,3,4].each.with_index do |a,b|
      puts "#{b}: #{a}"
    end
    

    【讨论】:

    • 为了避免& interpreted as argument prefix 警告,请在&method 周围添加括号,例如my_collection.each(&method(:my_method))
    猜你喜欢
    • 1970-01-01
    • 2021-06-26
    • 1970-01-01
    • 2014-08-07
    • 1970-01-01
    • 2015-04-01
    • 2022-01-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多