I met this when I read ZenTest source code:
Here is the definition of add_mapping method:
def add_mapping(regexp, &proc)
@test_mappings << [regexp, proc]
end
In the Autottest.initailize()
, add_method
get called to add mapping for implementations.
self.add_mapping(/^lib\/.*\.rb$/) do |filename, _|
possible = File.basename(filename).gsub '_', '_?'
files_matching %r%^test/.*#{possible}$%
end
My question is what "_", the second parameter of the block, means? Seems it is not used in the block.
Thanks
It's an idiom used to indicate the the parameter bound to '_' is not used, even though it's required to be passed to the block/method.
example:
def blah
yield 1,2
end
blah {|a,b|
puts a
# b is never used
}
compare to the identical:
blah {|a,_|
puts a
}
Note that '_' is a perfectly legal variable name in ruby, so the two versions are identical, the following works as well:
blah {|a,_|
puts _
}
Using '_' is nothing more than a convention like using i
for counters, 'x' and 'y' or 'foo' and 'bar'.
It means you're cool because you've been dabbling with functional programming, which is, I believe, where this idiom orignates...
def animals
yield "Tiger"
yield "Giraffe"
end
animals { |_| puts "Hello, #{_}" }
Example stolen from http://en.wikibooks.org/wiki/Ruby_Programming/Ruby_Basics
As far as I can see, it's defining _ as a variable which could be referenced later on. This is just forcing ruby's hand and defining _ as to the value of whatever is yielded.
Perhaps the author is using it as a short variable name so that the second parameter can be ignored.
来源:https://stackoverflow.com/questions/471952/parameter-of-ruby-block