rubyzentest

"_" 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


Solution

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