2

我在阅读 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

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

谢谢

4

3 回答 3

6

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

例子:

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' 一样。

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

于 2009-01-23T13:32:38.633 回答
4
def animals
  yield "Tiger"
  yield "Giraffe"
end
animals { |_| puts "Hello, #{_}" }

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

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

于 2009-01-23T05:21:23.103 回答
2

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

于 2009-01-23T05:17:40.520 回答