technical termsって辞書にあんまり乗ってなくて、英語で文章を書くときに困るんですよね。見かけるたびにメモしていくことにしようっと。
| 英語 | 日本語 |
|---|---|
| singleton method | 特異メソッド |
| predicates | 述語 |
technical termsって辞書にあんまり乗ってなくて、英語で文章を書くときに困るんですよね。見かけるたびにメモしていくことにしようっと。
| 英語 | 日本語 |
|---|---|
| singleton method | 特異メソッド |
| predicates | 述語 |
505 :デフォルトの名無しさん:2012/02/06(月) 17:18:12.21 Rubyというか、loggerについて質問です。 log.warn("Nothing to do!") # W, [2005-02-10T20:03:56.489954 #12469] WARN -- : Nothing to do! 「--」の意味がわからないのですが、何のために出力されるのでしょうか?506 :デフォルトの名無しさん:2012/02/06(月) 17:27:52.61 irb> require 'logger' irb> log = Logger.new($stdout) irb> log.warn('my_program'){'WARNING!!'} W, [2012-02-06T17:24:16.031628 #5320] WARN -- my_program: WARNING!! というわけで、そのコロンの前には実はプログラム名が省略されていて、それとログレベル表示を区別するためのハイフンなのだ ほとんど使われない機能ではあるのだけど
ensure節は、他の制御移転処理を実行して例外が伝播するのをキャンセルすることができる。ensure節が新しい例外を生成すると、元の例外の代わりに新しい例外が伝播する。ensure節にreturn文が含まれていれば、例外の伝播はそこで止まり、ensure節を含むメソッドは呼び出し元に戻る。
begin return 1 # 呼び出し元に戻る前にensure節にジャンプする ensure return 2 # 戻り値をこの新しい値に置き換える endうわー、気をつけないとトラブルなりそう...。
rescue節は新しい変数スコープを定義しないので、rescue節で名前を与えられた変数は、rescue節終了後も見えることに注意しよう。
え?まじで?かなり直感に反するんですが。
begin a = b rescue => ex puts ex # undefined local variable or method `b' for main:Object end puts ex # undefined local variable or method `b' for main:Object
まじだった...。なんでこんな仕様なんだろう...。
returnを囲っているメソッドは、returnを呼び出してきたメソッドとは必ずしも同じではない。ブロック内でreturn文を使うと、ブロックが終了するだけでは話は終わらない。そして、ブロックを呼び出したイテレータが終了してもまだ話は終わりではない。return文があると、いつでもreturnを囲っているメソッドが終了するのである。囲っているメソッドは、字句的に囲っている(exically enclosing)メソッドとも呼ばれ、ソースコードを見たときにブロックを囲っているメソ\ッドのことである。
def find(array, target)
array.each_with_index do |element, index|
return index if (element == target) # findから戻る
end
nil # 要素が見つからなければnilを返す
end
これに対して、ブロック内では、nextの後の式や式リストは、ブロックを呼び出したyield文の「戻り値」になる。nextの後に式がなければ、yieldの値はnilになる。
# 157ページより squareroots = data.collect do |x| next 0 if x < 0 # 負数に対しては0を返す Math.sqrt(x) end
ただ、上のコードは、例えば次のように書き換えられる。
squareroots = data.collect do |x| if (x < 0) then 0 else Math.sqrt(x) end end
うーん。nextの使い道が難しいw
引数が1個のブロックを宣言すれば、多重代入のルールにより、2個の値が自動的に配列にまとめられるはずだと予想される。しかし、現実にはそのようには動作しないのだ。
def tow; yield 1,2; end # 2個の値を渡すイテレータ
two {|x| p x} # Ruby 1.8: 警告を発して[1,2]を出力
two {|x| p x} # Ruby 1.9: 警告なしで1を出力
two {|*x| p x} # 両バージョン: 警告なしで[1,2]を出力
two {|x,| p x} # 両バージョン: 警告なしで1を出力