history

青木日記 RSS

<前の日 | この月 | 次の日>

2003-10-16

メソッド呼び出し括弧の省略

前はメソッド呼び出しの括弧は省略しまくっていたけど、 最近は反動のように括弧を付けるようになった。

原則は以下の通り。

  • 返り値を使うときは付ける。
  • 返り値を使わないときは付けない。

おれは 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 のパーサがちゃんと解析してくれるからと言ってそれに頼ってはいけない。 仕様はどうせすぐ変わる。

HDD の向き

http://www.tokyo-nazo.net/~tester/title.html#20031016 (もなQぽぉたる from カトゆー家断絶 )

HDD は縦置きでも横置きでも寿命は変わらないらしい。 縦だと短かくなると思ってたよ……。

そういえば AlphaServer800 は HDD が縦入れだな。 エントリサーバだからそんなもんかと思ってたけど、そうでもないのか。

Ruby / 実行速度

さて問題です。 次の二つの 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) のほうが高速でした。かなり意外じゃない?

flatten ReFe

~/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 を出そう。

本日のツッコミ(全2件) [ツッコミを入れる]
ken_u (2003-10-16 21:58)

なんか「返り値を使うときは付ける、返り値を使わないときは付けない」 Visual Basicのようです。(.Netは非知)

あおき (2003-10-16 22:24)

あ、それ自分でも思ってました (笑)

名前
メールアドレス

<前の日 | この月 | 次の日>
2002|04|05|06|07|08|09|10|11|12|
2003|01|02|03|04|05|06|07|08|09|10|11|12|
2004|01|02|03|04|05|06|07|08|09|10|11|12|
2005|01|02|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|04|05|06|09|10|
2009|07|
2010|09|

Copyright (c) 2002-2007 青木峰郎 / Minero Aoki. All rights reserved. LIRS