落書きノート

ふと自分が気になった事を書いてます

Ruby資格技術者認定問題集

久しぶりにRubyをブログで載せているような気がします。気になったことを載せます。

irb(main):037:0> a,b,c=[1,2,3]
=> [1, 2, 3]
irb(main):038:0> (a,b),c = [1,2],3
=> [[1, 2], 3]
irb(main):039:0> p a
1
=> 1
irb(main):040:0> p b
2
=> 2
irb(main):041:0> p c
3
=> 3

上記のコードは同じことをやっています。つまりaに1を、bに2を、cに3を代入しています。いわゆる多重代入ですね。ひっかけです。

irb(main):065:0> a, *b = 1,2,3
=> [1, 2, 3]
irb(main):066:0> p a
1
=> 1
irb(main):067:0> p b
[2, 3]
=> [2, 3]
irb(main):068:0> def foo a,*b
irb(main):069:1> b
irb(main):070:1> end
=> :foo
irb(main):071:0> foo(1,2,3)
=> [2, 3]
irb(main):072:0> def foo1 a, *b
irb(main):073:1> foo2(*b)
irb(main):074:1> end
=> :foo1
irb(main):075:0> def foo2 c, *d
irb(main):076:1> d
irb(main):077:1> end
=> :foo2
irb(main):078:0> foo1(1,2,3)
=> [3]

上記は変数の前にアスタリスクをつけた可変長引数です。ひとつの変数に複数の値を持たせるという機能です。コードによっては再帰のような機能を試してるコードがあります。ちょっとした頭の運動ですね。

irb(main):080:0> a = [1,1,2,2]
=> [1, 1, 2, 2]
irb(main):081:0> b = [2,2,3,3]
=> [2, 2, 3, 3]
irb(main):082:0> a & b
=> [2]
irb(main):083:0> a | b
=> [1, 2, 3]

&と|を使った積演算と和演算です。&演算子では、数値ではビット演算子となり論理積を返しますが、配列では集合の積演算となり、両方に含まれる要素から構成される配列が返ります。|演算子では、集合の和演算となり、どちらかに含まれる要素から構成される配列となります。これらの結果は、同値のものは排除されます。

要するにa & bでは、1と3が排除され、2だけが結果として残ります。3は、bの右オペランドとなるため、排除されます。a | bでは、1,2,3ですね。

irb(main):087:0> a + b
=> [1, 1, 2, 2, 2, 2, 3, 4]
irb(main):088:0> a - b
=> [1, 1]

+演算子や-演算子も使えます。+演算子はそのままつなげます。-演算子は、1だけ残ります。3は先ほどと同様にbが右オペランドのため、排除されます。

irb(main):089:0> a = [1,1,2,2]
=> [1, 1, 2, 2]
irb(main):090:0> c = [1]
=> [1]
irb(main):091:0> a - c
=> [2, 2]

これは簡単ですね。cの1がひとつでもaの1が2つとも排除されています。

irb(main):092:0> [1,2] * 3
=> [1, 2, 1, 2, 1, 2]
irb(main):093:0> [1,2,3] * "-"
=> "1-2-3"
irb(main):094:0> [1,2,3].join("-")
=> "1-2-3"

配列にアスタリスク演算子を使うことによって、[1,2,1,2,1,2]となります。右オペランドが数値の場合はこうなります。右オペランドが文字列の場合は、その文字を区切りとして要素を連結した文字列を返します。joinメソッドと同じ役割です。