2013/02/25

論理和・論理積演算子

初めてのRubyより

論理積や論理和はtrue やfalse ではなく、オペランドのいずれかを返します。これはC 言語族の多くとは異なる特徴です。  例えばnil || 50 という式を評価したとしましょう。50 は真でnil は偽ですから、式全体の値は50 となり ます。

初めてのRuby 6.2.3 論理和・論理積演算子 111ページ
まじで!
でもよく考えたら確かにこっちの仕様のほうが応用ききそうですね。それで偽がnilとfalseだけなんですね。


補足:
しっかし、何が偽であるかはlispと同じなのに、論理演算子の戻し値はlispと違うんですね...。
いろんな言語に手を出すと本気でこんがらがって来るなぁ。
Rubyの面白いところ Part 1 「何がfalseと評価されるか」

2013/02/24

Validatable

コンストラクタの中での例外の話し。
この議論の中でValidatableについてリンクが貼られていた。この辺見てて思ったんだけど、型チェックある言語使ったほうがいいんじゃないだろうか...。

2012/03/25 追記:
よくよく考えるとこれいいな。コンストラクタでどうしても例外が発生する可能性がある場合は、例外を握りつぶした後エラーチェックすべきか。でも、エラーチェックを忘れそう...。ムムムム。

2013/02/22

型と自動変換

初めてのRubyより

Rubyは強く型付けされた言語なので、データ型が自動変換されることはほとんどありません。データはいつでも特定のクラスに属しており、演算の最中にいつの間にか他のクラスに属しているということはありません。例えばPerl などとは異なり、1 + "2" という演算は3 を返さずに例外を発生します

初めてのRuby 3.2.5 型と自動変換 67ページ
そういえば静的言語って型がないことでLLに対してかなりダメだしをしますが、promoteのサポートが多いですよね。

2013/02/09

除算

初めてのRubyより

整除の結果は、剰余の符号が除数と同じになるように調整されます。このため、両辺の符号が異なる場合には、除数と商の積は被除数よりも絶対値が大きくなります。

初めてのRuby 3.2.1 除算 49ページ
こういうのって思い出そうとしても思い出せないんっすよねorz

2013/02/08

添字代入の裏側

初めてのRubyより

添字参照式が返す値は、配列が保持している「オブジェクトへの参照」です。「オブジェクトへの参照」に式を 代入するというのは意味が分かりません。

あるいは、長さ付き参照や範囲参照の式ならば「配列の一部の要素を元に新たに作成された配列」を返します。けれども、新規に作成された配列に代入したところで、元の配列が更新されるのは話がおかしいでしょう。

実は、添字代入式は添字参照式とはまったくの別物です。後者はArray#[]メソッドの呼び出しでしたが、前者はArray#[]=メソッドの呼び出しです。両者はできるだけ一貫性を保つように実装されています。けれども、本質的には異なるメソッドなので細かな挙動には違いがあります。例えば、以下のようになります。

初めてのRuby 2.1 添字代入の裏側 33ページ
a = ["a", "b"]
a[-3] #=> nil 範囲外のアクセスに対してはnil を返す
a[-3] = 1 #=> IndexError 例外を発生
こういう挙動の不一致をすぐにあげられるようになりたいなぁ。メモメモ。