eric2323223
eric2323223

Reputation: 3628

"_" parameter of Ruby block

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

Upvotes: 2

Views: 553

Answers (3)

a2800276
a2800276

Reputation: 3328

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...

Upvotes: 6

Ryan Bigg
Ryan Bigg

Reputation: 107728

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.

Upvotes: 4

Sophie Alpert
Sophie Alpert

Reputation: 143154

Perhaps the author is using it as a short variable name so that the second parameter can be ignored.

Upvotes: 2

Related Questions