2009-01-23 125 views
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 

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

感谢

回答

7

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

例如:

def blah 
    yield 1,2 
end 

blah {|a,b| 
    puts a 
    # b is never used 
} 

比较相同:

blah {|a,_| 
    puts a 
} 

注意,“_”是红宝石完全合法的变量名,所以这两个版本是相同的,下面的作品well:

blah {|a,_| 
    puts _ 
} 

使用'_'只不过是一个约定,如使用i为柜台,'x'和'y'或'foo'和'bar'。

这意味着你很酷,因为你已经和函数式编程,这一点,我相信,在这个成语orignates ...

2

也许作者使用它作为一个短变量名称,以便第二个参数可以忽略不计。

+0

你的意思是“_”在这里可以通过任何变量替换涉足名称? – eric2323223 2009-01-23 05:20:11

+0

没错,我想。由于它没有被使用,所以没关系。 – 2009-01-23 05:29:33

+0

这是正确的。 _在许多语言中很常见,因为变量名称没有明确使用。这意味着“不理我” – 2009-01-23 07:01:04

4
def animals 
    yield "Tiger" 
    yield "Giraffe" 
end 
animals { |_| puts "Hello, #{_}" } 

来自实例http://en.wikibooks.org/wiki/Ruby_Programming/Ruby_Basics

据我所看到的,它的定义_作为可在以后引用的变量被盗。这只是迫使红宝石的手,并确定_什么是所产生的价值。