出会い系サイトの通信量にみる男女の外見のとらえ方の違い @ GIGAZINE
ためになるなぁー。
2009/11/26
2009/11/23
2009/11/20
Rubyの面白いところ Part 8 「定数への代入」
定数の代入には特別なルールがある。
変数とは異なり、定数は、Rubyインタプリタが実際に代入式を実行するまで作成されない。次のような評価されない式では定数は作成されない。
そのため、定数は未初期化状態にならない。
- 既に存在する定数に代入すると、Rubyは警告を発する。しかし、Rubyは代入自体は実行する
- 定数への代入はメソッド本体の中では認められない。なぜならメソッドは1度以上呼ばれるものだと想定しているから
変数とは異なり、定数は、Rubyインタプリタが実際に代入式を実行するまで作成されない。次のような評価されない式では定数は作成されない。
N = 100 if false
そのため、定数は未初期化状態にならない。
Rubyの面白いところ Part 7 「NameErrorが起こらないとき」
値が代入されていないクラス変数が参照されると、RubyはNameErrorを起こす。それはローカル変数についても同様。しかし、クラス変数の先頭には@@というprefixがついているのに対して、ローカル変数には何もprefixがついていない。そのため、ローカル変数参照は、メソッド呼び出しのように見えるのである(何故ならRubyは括弧を省略できる)。Rubyインタプリタは、ローカル変数に対する代入を検出すると、それが変数であってメソッドではないことを知ることができるので、変数名が現れた時には値を返せる。そして、代入を検出していない場合には、Rubyはその式をメソッド呼び出しとして扱う。その名前のメソッドが存在しない場合には、RubyはNameErrorを起こす。
しかし、ここで注意することがある。Rubyインタプリタが変数に対する代入式を検出すると、その変数は存在するようになる。
a = 0.0 if false #この代入は絶対実行されない
print a # nil
print b # NameError
プログラミング言語 Ruby 第2刷 91ページ より
追記:2011/05/05
次のsnippetsはNameErrorを起こす。
for i in 1..2 if i == 2 print a else a = 1 end endしかしながら、次のsnippetsはNameErrorを起こさない。
for i in 1..2 if i != 2 a = 1 else print a end end参考: 2.3 ローカル変数はいつ参照可能になるのでしょうか
2009/11/19
Rubyの面白いところ Part 6 「==演算子の意味はJavaと異なる」
==演算子は、Objectクラスではequal?メソッドと同じ意味に過ぎず、2個のオブジェクト参照が等しいかどうかをテストする。これは次と等しい。
a.object_id == b.object_id
しかし、ほとんどのクラスでは、インスタンスは別でも値が等しいかどうかをテストできるように定義しなおされている。
a = "Ruby"
b = "Ruby" # 内容は同じだが別のStringオブジェクト
a.equal?(b) # false: aとbは同一のオブジェクトではない
a == b # true: しかし、2つの異なるオブジェクトは同じ値を持っている
Javaは2つのオブジェクトが同一オブジェクトかどうかをテストするときには==演算子、2つの別々のオブジェクトが同じ値かどうかをテストする時にはequalsメソッドを使う習慣になっているため、ちょうど逆である。
プログラミング言語 Ruby 第2刷 80ページ より
2011/04/27 追記
参考: Rubyリファレンス日記
Rubyの面白いところ Part 5 「実はオブジェクト参照に対して操作している」
変数に値を代入するときは、代入先の変数の「中に」オブジェクトをコピーするのではなく、変数にオブジェクトの参照を格納しているだけである。
プログラミング言語 Ruby 第2刷 76ページ より
s = "Ruby" # Stringオブジェクトを作り、参照をsに格納する
t = s # 参照のコピーを作ってtに格納する。sとtは同じオブジェクトを参照する
t[-1] = ""
t = "Java" # tは別のオブジェクトを参照する
print s, t # "RubJava"と表示
プログラミング言語 Ruby 第2刷 76ページ より
2009/11/16
Rubyの面白いところ Part 4 「Arrayの和集合と積集合は交換則が成り立たない」
Arrayクラスに論理演算子|と&を用いると、それぞれ和集合と積集合になる。
プログラミング言語 Ruby 第2刷 69ページ より
-a/bとa/(-b)といい、対象性についてはRubyはあまりこだわりを持ってないのかなぁー…。
a = [1, 1, 2, 2, 3, 3, 4]
b = [5, 5, 4, 4, 3, 3, 2]
a & b # [2, 3, 4]
b & a # [4, 3, 2] 要素は同じだが順序は逆
プログラミング言語 Ruby 第2刷 69ページ より
-a/bとa/(-b)といい、対象性についてはRubyはあまりこだわりを持ってないのかなぁー…。
2009/11/15
Rubyの面白いところ Part 3 「Rubyの算術演算」
除算の演算子は、両辺のクラスによって動作を変える。
分子分母の片方だけが負数のとき、Rubyが行う整数の除算、剰余計算は、C、C++、Javaとは異なる。-7/3をしたとき、それらの言語が-2に丸めるのに対して、Rubyは-3を返す。
Rubyは-a/bはa/-bに等しいが-(a/b)とは等しくならない場合がある。
プログラミング言語 Ruby 46ページ より
[5/2, 5.0/2] # => [2, 2.5]
分子分母の片方だけが負数のとき、Rubyが行う整数の除算、剰余計算は、C、C++、Javaとは異なる。-7/3をしたとき、それらの言語が-2に丸めるのに対して、Rubyは-3を返す。
Rubyは-a/bはa/-bに等しいが-(a/b)とは等しくならない場合がある。
プログラミング言語 Ruby 46ページ より
Rubyの面白いところ Part 2 「文の終端としての改行」
CやJavaと違ってセミコロンを使って改行を示さない文化だ。そして、セミコロンで文末が明示されていない場合、Rubyインタプリタは、行の中のRubyコードが構文的に完全な文になっていれば改行を文終端として扱う。文が完全でなければ、次の行までの文の解析を続ける。
次のコードはxとyが間して合計をtotalに代入する。
しかし、次のコードはtotalにxを代入し、次にyを評価して、これに対しては何もしない。
プログラミング言語 Ruby 35ページより
次のコードはxとyが間して合計をtotalに代入する。
total = x + #式が不完全なので、解析は次の行に続く
y
しかし、次のコードはtotalにxを代入し、次にyを評価して、これに対しては何もしない。
total = x # これは完全な式
+ y # 何の約にも立たないが、完全な式
プログラミング言語 Ruby 35ページより
Rubyの面白いところ Part 1 「何がfalseと評価されるか」
Rubyの勉強を始めたので面白いところ、他の言語と違うところをぺたぺたメモ書き。
他の言語では0はfalseとして取り扱われることが多いが、rubyはnilとfalse以外の全てがtrueとして取り扱われる。つまり、0と""がtrueとなる。
この結果はtrueとなる。
補足:
論理和・論理積演算子
2013/08/29 追記:
ふと気づいたけど、lispと似てますね。
他の言語では0はfalseとして取り扱われることが多いが、rubyはnilとfalse以外の全てがtrueとして取り扱われる。つまり、0と""がtrueとなる。
if 0 puts "true" else puts "false" end
この結果はtrueとなる。
補足:
論理和・論理積演算子
2013/08/29 追記:
ふと気づいたけど、lispと似てますね。
登録:
投稿 (Atom)