前はメソッド呼び出しの括弧は省略しまくっていたけど、 最近は反動のように括弧を付けるようになった。
原則は以下の通り。
おれは return 書かない派なので、 この括弧規則で返り値のあるなしを暗黙のうちに指定したりする。 たとえば、
def parse( str ) _parse(str) end
このときは括弧が付いてるので、 parse は返り値が重要なメソッド。
def m do_something arg end
このときは括弧が付いてないので、 m は返り値に期待してはいけないメソッド。
また以前は include? みたく「?」「!」のついたメソッドには あまり括弧を付けなかったけど、前述の基準に従った結果付けることが多くなった。 例えば File.file? などは必ず返り値を使うだろうから括弧を付けることになる。
if File.file?(path) ....
ただし、後述するように、引数がない場合だけは付けない。
返り値を何かに代入する場合も 当然返り値を使っているから原則通り括弧を付ける。 たとえ引数がなくても付ける。
lvar = m(arg) lvar2 = m2()
何かをするだけの場合は付けない。 たとえ引数がなくても付けない。
def m do_something arg do_anything end
とすると当然 require や include や private には括弧を付けなくてよい。
require 'racc/parser' class C include Enumerable private :print end
ただし、まずないとは思うが、require や include の返り値を使うときは やっぱり原則通り括弧を付ける。
「recv.method」のように、レシーバがあり、 引数がないときは例外的に付けない。
イテレータは引数の有無のみで分ける。 引数ありなら付ける (a.inject(i) {...})。 引数なしなら付けない (a.each {...})。 そのかわり、イテレータメソッドの返り値の有無は do...end と {...} の差として出す (返り値を使うときは {...})。
引数に「*」と「&」が付く場合。 これが第一引数に来る場合は括弧を付けないと 警告が出るのでしかたなく付ける。
a.push(*values) a.each(&block)
第一引数が括弧でくくられているとき。 これもやっぱり警告が出るのでしかたなく付ける。
p((0..3).to_a)
1.8 のパーサがちゃんと解析してくれるからと言ってそれに頼ってはいけない。 仕様はどうせすぐ変わる。
http://www.tokyo-nazo.net/~tester/title.html#20031016 (もなQぽぉたる from カトゆー家断絶 )
HDD は縦置きでも横置きでも寿命は変わらないらしい。 縦だと短かくなると思ってたよ……。
そういえば AlphaServer800 は HDD が縦入れだな。 エントリサーバだからそんなもんかと思ってたけど、そうでもないのか。
さて問題です。 次の二つの Ruby プログラムはどちらが早く終了するでしょうか。 なお「data」は 1 行 20 バイト × 20000 行のテキストファイルとします。
# (1) h = {} File.foreach('data') do |line| h[line.strip] = true end # (2) h = {} File.readlines('data').map {|line| line.strip }.each do |s| h[s] = true end
答えは自分で実行して確かめてみよう!
(意訳) 環境によって結果が違ってたら嫌だから明言しないでごまかそう
などと書きつつも答えを言ってしまいますが、 家では (2) のほうが高速でした。かなり意外じゃない?
~/c/refe % refe Array inject | head aamine@harmony Array < Enumerable#inject --- inject([init]) {|result, item| ... } ruby 1.7 feature 最初に初期値 init と self の最初の要素を引数にブロック を実行します。2 回目以降のループでは、前のブロックの実行結果と self の次の要素を引数に順次ブロックを実行します。そうして最 後の要素まで繰り返し、最後のブロックの実行結果を返します。 要素が空の場合は init を返します。
なんて感じの機能が実装できた。
のだが、まだ何かバグがあるらしく refe String split が検索できなくなったりしている。 もうちょいだな。これが安定したら version 0.8.0 を出そう。
なんか「返り値を使うときは付ける、返り値を使わないときは付けない」 Visual Basicのようです。(.Netは非知)
あ、それ自分でも思ってました (笑)