代码之家  ›  专栏  ›  技术社区  ›  eric2323223

Ruby块的“_”参数

  •  2
  • eric2323223  · 技术社区  · 17 年前

    我在阅读ZenTest源代码时遇到了这个问题:

    def add_mapping(regexp, &proc)
      @test_mappings << [regexp, proc]
    end
    

    在the Autottest.initailize() add_method 被调用为实现添加映射。

    self.add_mapping(/^lib\/.*\.rb$/) do |filename, _|
      possible = File.basename(filename).gsub '_', '_?'
      files_matching %r%^test/.*#{possible}$%
    end
    

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

    3 回复  |  直到 17 年前
        1
  •  6
  •   a2800276    17 年前

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

    例子:

    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”。

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

        2
  •  4
  •   Ryan Bigg Andrés Bonilla    17 年前
    def animals
      yield "Tiger"
      yield "Giraffe"
    end
    animals { |_| puts "Hello, #{_}" }
    

    示例被盗自 http://en.wikibooks.org/wiki/Ruby_Programming/Ruby_Basics

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

        3
  •  2
  •   Sophie Alpert    17 年前

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

    推荐文章