【问题标题】:"_" parameter of Ruby blockRuby 块的“_”参数
【发布时间】:2009-01-23 05:14:58
【问题描述】:

我在阅读 ZenTest 源代码时遇到了这个:

下面是add_mapping方法的定义:

def add_mapping(regexp, &proc)
  @test_mappings << [regexp, proc]
end

Autottest.initailize() 中,调用add_method 为实现添加映射。

self.add_mapping(/^lib\/.*\.rb$/) do |filename, _|
  possible = File.basename(filename).gsub '_', '_?'
  files_matching %r%^test/.*#{possible}$%
end

我的问题是块的第二个参数“_”是什么意思?好像没有在块中使用。

谢谢

【问题讨论】:

    标签: ruby zentest


    【解决方案1】:

    这是一个习惯用法,用于指示绑定到 '_' 的参数未使用,即使它需要传递给块/方法。

    示例:

    def blah
       yield 1,2
    end
    
    blah {|a,b|
      puts a
      # b is never used
    }
    

    比较相同的:

    blah {|a,_|
       puts a
    }
    

    注意 '_' 在 ruby​​ 中是一个完全合法的变量名,所以两个版本是相同的,下面的也一样:

    blah {|a,_|
       puts _
    }
    

    使用 '_' 只不过是一种约定,例如使用 i 表示计数器、'x' 和 'y' 或 'foo' 和 'bar'。

    这意味着你很酷,因为你一直在涉足函数式编程,我相信这就是这个成语的起源......

    【讨论】:

    • @a2800276,你能给我看一些关于这个“_”成语的教程或资源吗?
    • 没有教程,只是一个成语,常用的用法。如果您想查看来源,它只是一个变量名称,就像其他任何变量一样(我已经编辑了 ost 以使其更清晰)Google '函数式编程模式匹配通配符'。
    【解决方案2】:
    def animals
      yield "Tiger"
      yield "Giraffe"
    end
    animals { |_| puts "Hello, #{_}" }
    

    http://en.wikibooks.org/wiki/Ruby_Programming/Ruby_Basics盗取的示例

    据我所知,它将 _ 定义为以后可以引用的变量。这只是强迫 ruby​​ 的手,并将 _ 定义为所产生的任何值。

    【讨论】:

    • @Radar,我能理解你的例子。但是为什么我的问题中的“”引用了块的结果? add_method 调用的顺序究竟如何?据我了解,“”应该引用“文件名”变量。
    【解决方案3】:

    或许作者将其用作短变量名,以便可以忽略第二个参数。

    【讨论】:

    • 你的意思是这里的“_”可以换成任何变量名吗?
    • 没错,我想。既然没有被使用,那就无所谓了。
    • 这是正确的。 _ 在许多语言中很常见,因为变量名称没有明确使用。它的意思是“忽略我”
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-03-15
    • 2020-10-28
    • 2010-09-30
    • 1970-01-01
    • 1970-01-01
    • 2017-06-11
    • 2014-10-02
    相关资源
    最近更新 更多