読者です 読者をやめる 読者になる 読者になる

アンダースコアを変数名に使うことについて

同僚がアンダースコアを変数名として使って、他の人に直されてコミットログで指摘されたと愚痴をこぼしていたので、他の人はどうだろうとふと思った。
僕がRuby語を書いてる時、変数名にアンダースコアを使うときは

  • Hash等、Enumerableなものでブロック内で使わないもの
  • あるスコープで意味を成さないけど変数として欲しい

の2点だ。
前者は、よく見かけると思うんだけど

h = {hoge: "hoge", fuga: "fuga"}
h.each {|_, v|
  v.something
}

と、Hashをeachで回す時にkeyは使わずにvalueだけ使うときはこう書いてる。
後者は、RSpecのコードを書いてる時に良く書いたりする。

let(:user) {
  _ = User.new(
    name: "hoge"
  )
  stub(_).somthing_stub { result }
  _
}

こんな感じにテスト中にuserが欲しいんだけど、とあるプロパティをstubしたい時にメソッドチェインできないので仕方なく変数を用意しなくちゃいけないんだけど、僕が欲しいのはuserでそれはletに束縛してるので、このスコープでは「変数なんだけど変数名はいらない」となる。
多分、関数型言語、というよりパターンマッチについて知識がある人は、「そこがどうなっているか気にしない」という場合に必然的に使うことを知っているから使うことに抵抗が少ないと思う。