Ruby4章後半(演算子)1. +
Ruby
輪輪講
No.5
HIROSHI
ISHIMARU
2. +
4.6.1
4.6.2
単項
指数
4.6.12
defined?
演算⼦子
4.6.13
⽂文修飾⼦子
4.6.3
算術演算⼦子
4.6.14
演算⼦子では
4.6.4
シフトと
ない記号
追加
4.6.5
補数,BIT
Table of Contents 4.6.7
AND,OR,XOR
等値
Page
105~
4.6
演算⼦子
4.6.8
論論理理演算
⼦子
4.6.9
範囲
4.6.10
条件
4.6.11
代⼊入演算⼦子
4. +
演算⼦子
n 演算⼦子(operators)とは、1個以上のオペランドを対象とし
て実⾏行行される演算を表すRuby⾔言語のトークンである。演算⼦子
はこれらの式を結合して⼤大きな式を作る。
n 例例)
n 数値リテラル2と演算⼦子+を組み合わせて「2+2」という式を作
る。
n 2
*
Math.sprt(2)
<
limit
数値リテラル 変数参照式
メソッド呼び出し式
それぞれを乗算演算⼦子、より⼩小さいの2つの演算⼦子で結合している。
5. +
n 項数(arity)とは、操作対象の式の個数
!
"
. .
n 単項演算⼦子(unary
operators)は1個
⼆二項演算⼦子(binary
operators)は2個
#
n
n 三項演算⼦子(ternary
operators)は3個
n ただし、三項演算⼦子は1種のみである。また、+、ーに関しては単項
と⼆二項の⼆二種を持っている事に注意。
演算⼦子の優先度度(precedence)は、演算⼦子と式がどれだけ「固
演
算
n
く」結びついているのかで、式の順番を評価するのに影響がある。
n 例例)1
+
2
*
3
n
#
=
>
7
乗算演算⼦子が加算演算⼦子より優先度度が⾼高いので式は7と評価される。
⼦子
n 例例)(
1
+
2
)
*
3
#
=
>
9
n 括弧を使って部分式をまとめればいつでも独⾃自の評価順を指定できる。
n 演算⼦子の結合性(associativity)とは同じ演算⼦子、または同じ優先
順位の演算⼦子が⼀一つの式の中に並んでいるときの評価基準である。
6. +
n 結合性
!
"
. .
n 「左」は、■→◎の順で評価される
n 「右」は、■←◎の順で評価される
n 「無」は、結合性なし。つまり括弧で評価順を指定しない限り1つの式
で複数使⽤用する事は出来ない。
#
n ほとんどの演算⼦子は左結合である。
10
-‐
5
-‐
2
は 10
-‐
(
5
-‐
2
)
では無く
(10
-‐
5
)
-‐
2
と評価される。
しかし、指数関数は右結合で
2**3**4
は
2**(3**4)と評価される。
同様に、代⼊入も
a
=
b
=
0
ではまず0が変数
b
に代⼊入され、次にその値
が変数
a
に代⼊入される。
演
再定義とメソッド
算
⼦子
n
n Rubyは⼀一部の演算⼦子をメソッドとして実装している。
n 表の◯となっている演算⼦子はメソッドで実装されているので、再定義
が出来る。当然
×
は定義出来ない。
n ⼀一部のクラスは同じ演算⼦子を別の意味で提起している場合がある。
n 例例えば、+演算⼦子は数値の加算を⾏行行うので数値演算⼦子に分類されてい
るが、⽂文字列列や配列列の結合にも使われる。メソッドベースの演算⼦子は、
演算⼦子の左に出現するオブジェクトのメソッドとして起動される。残
りの演算対象は、メソッドの引数として渡される。メソッドベースの
演算⼦子のクラスによる定義は、同じクラスの他のメソッドと同じよう
に探索索される。
7. 演算⼦子 項数 結合性 再定義 演算
!
~
+ 1 右 ○ 論論理理NOT
ビット単位補数 単項プラス
** 2 右 ○ 指数
-‐ 1 右 ○ 単項マイナス
*
/
% 2 左 ○ 乗算 除算 剰余
+
-‐ 2 左 ○ 加算 減算
<<
>> 2 左 ○ ビット単位左シフト ビット単位右シフト
& 2 左 ○ ビット単位AND
|
^ 2 左 ○ ビット単位OR
ビット単位XOR
<
<=
>=
> 2 左 ○ 順序
==
===
!=
=~
<=> 2 無 ○ 等値 パターンマッチ ⽐比較
&& 2 左 × 論論理理AND
|| 2 左 × 論論理理OR
・・ ・・・ 2 無 × 範囲作成および論論理理フリップフロップ
?: 3 右 × 条件
rescue 2 左 × 例例外処理理装飾⼦子
= 2 右 × 代⼊入
**=
*=
/=
%=
+=
-‐=
<<=
>>=
&&=
&=
||=
^=
defined? 1 無 × 変数定義と型のテスト
not 1 右 × 論論理理NOT(低優先順位)
and
or 2 左 × 論論理理AND
論論理理OR(低優先順位)
if
unless
while
until 2 無 × 条件分枝 繰り返し修飾⼦子
9. +
単項
+,-‐
n 単項マイナス
n 数値の引数を変更更する。
n 単項のプラスも認められているが、数値には何の影響も無い。
n 単項マイナスと対称性を保ために⽤用意されているもので、再定義
も可能。+とーでは優先順位はやや“ー”のほうが低い。
n メソッド名
n -‐@、+@
n 演算⼦子の再定義、メソッド形式での呼び出し、演算⼦子のドキュメ
ントの探索索などで必要となる
11. +
指数:**
n **は第1引数を第2引数の回数だけ乗じていく指数計算を⾏行行う。
n 第2引数として分数を使⽤用すると累累乗根も計算できる。
n 例例)
n x**(1.0/3.0)
#
x
の⽴立立⽅方根
n x**-‐y
#
1
/
(x**y)
と同じ
n x**y**z
#
x**(y**z)
と同じ
n **は左結合
n -‐1**0.5
#
-‐(1**0.5)
と同じ
n **は単項マイナス演算⼦子より優先順位が⾼高いから
n 本当に -‐1
の平⽅方根を取りたいなら
(-‐1)**0.5
とする。←ルートの中
がマイナスで虚数
n Rubyでは虚数はFloatのインスタンスとして表現できません。こ
の式はNaNと評価される。
12. +
A O
RITHEMETIC
PERATOR
算術演算⼦子
13. +
算術演算⼦子+,-‐,*,/,%
n 題名の演算⼦子は、全てNumericクラスとして演算を⾏行行う。
n [除算]整数の除算は整数の商を返し、⼩小数点以下を切切り捨てる。
不不動⼩小数点数の
0.0
による除算は、プラスかマイナスかのInfinityを
返す。不不動⼩小数点数の
0.0
を
0.0
で割ると、NaNが返される。
n [剰余]剰余演算⼦子
%
で計算。整数0による除算は、
ZeroDivisionErrorを起こす。
n Stringクラス
n +を⽂文字列列の連結演算⼦子として、*を反復復演算⼦子として使⽤用。
n %はsprintfdで引数を⽂文字列列に置換するために使⽤用。
n Array
クラス
n +を配列列の連結に、ーを差分取得に使⽤用。
n *は右辺のクラスによって異異なる動作をする。
n 配列列を数値で乗算すると配列列の内容を繰り返した、新しい配列列に
なる。右辺が⽂文字列列なら、⽂文字列列を引数として配列列のjoinメソッ
ドを呼び出したのと同意である。
14. +
A S
DD,
HIFT
シフトと追加
15. +
シフトと追加<<,>>
n Fixnum,Bignumクラス
n 左辺の引数のビットを左右にシフトする演算子として<<,>>を実装。
n 右辺の引数は、シフトするビット数で、負数を指定すると逆にシフ
トする。
n 例例)−2ビット左シフト = 2ビット右シフト
n Fixnumの左シフトは、最上位ビットが「シフトオフ」する事は無い。
n シフト結果がFixnumに収まらない時はBignumの値が返される。
n 右シフトは引数の最下位ビットを必ず捨てる。
n 意味)Rubyには
unsigned
int
のような物は無い。シフトはいつも
算術シフト。負の数は上位に無限に1のビットがたってると⾒見見な
してよく、従って負の数に対する右シフトは上位ビットが⽴立立った
まま残る。
16. +
!
"
. .
n 数値を1ビット左シフトするのは、2倍と同意。数値を1ビッ
ト右にシフトするのは2で割るのと同じ事である。
n 例例)数値を2進で表現し、シフト演算後に2進⽂文字列列に変換
!
n (
ob1011
<<
1
).to_s(
2
)
#
=>”10110”
11
<<
1
=>
22
シ
n (
ob10110
<<
2
).to_s(
2
)
#=>”101”
22
>>
2
=>
5
n <<
演算⼦子は、追加演算⼦子としても使⽤用される。*普通こっち。
String,Array,IOクラスや標準ライブラリに含まれるQuene,Loggerなど
フ
ト
n
の「追加可能」なクラスは
<<
をこの形で定義してる。
n
n
message
=
“hello”
massages
=
[]
#
⽂文字列列
#
空配列列
と
n massege
<<
“world”
#
⽂文字列列の追加
追
n
n
massages
<<
massage
STDOUT
<<
massage
#
配列列に⽂文字列列を追加
#
標準出⼒力力ストリームに出⼒力力
加
17. +
C OMPLEMENT,B IT
補数、ビット
18. +
補数、ビット単位AND,OR,XOR,~,&,|,^
n Fixnum,Bignum
n ビット単位のNOT,AND,OR,XOR処理理のためにこれらの演算⼦子を定義。
n ~は優先順位の⾼高い単項演算⼦子。他は優先順位の中間的な⼆二項演算
⼦子。
n [~]~は、整数0ビットを1に、1ビットを0に置き換え、1の
補数に当たる⼆二進数を作る。任意の整数
x
については、~x
は
-‐x-‐1
と同意。
n [&]&は、2つの整数からビット単位のANDを計算。結果は両
辺が共に1になっているビットだけが1になっている数値である
n 例例)(
ob1010
&
ob1100
).to_s(
2
)
#
=>
“1000”
n [|]|は、2つの整数からビット単位のORを計算。両辺のいずれ
かで①になっているビットは結果でも1になる。
n 例例)(
ob1010
|
ob1100
).to_s(
2
)
#
=>
“1110”
n [^]^は、2つの整数からビット単位のXORを計算。両辺の⽚片⽅方
だけが1になっているビットだけが、結果で1になる
n 例例)(
ob1010
&
ob1100
).to_s(
2
)
#
=>
“110”
19. +
!
"
. .
n 続き。。。
n 他のクラスでも使⽤用できる。(クラスによるぶれは出てく
$
る。)
n [配列列]&で積集合。|で和集合。
補
n TrueClass,FalseClass,NilClass
数、
論論理理演算⼦子として使えるようにするため,
&,|,^を定義してい
ビ
n
る(~
は定義なし)
n これらの演算⼦子を使うのが正しい場合は少ない。論論理理演算に
は、論論理理演算⼦子の&&,||が⽤用意されている。そして、これらの
演算⼦子は、演算の結果に影響が無ければ右辺を評価しないよ ト
うに作られているので効率率率的。
単
位
21. +
⽐比較
<,<=,>,>=,<=>
n ⼀一部のクラスはクラスのに属する⾃自然な順序が定義してある。
n 数値
⼤大⼩小
n ⽂文字列列
アルファベット順
n ⽇日付
時系列列順
n 2つの値の相対的な順序を判断する。
n ⾔言ってる事が正しい
true
n ⾏行行ってる事が異異なる
false
n ※ 引数の型に互換性が無ければ、⼀一般的に例例外を起こす
22. +
n <=>
演算⼦子の定義(汎⽤用⽐比較演算⼦子)
両辺の相対的な順序を⽰示す。
!
"
. .
n
n 左辺の⽅方が右辺より⼩小さければ
−1
n 左辺の⽅方が右辺より⼤大きければ
n 両辺が等しければ
+1
0
"
n 両辺の互換が無い
nil
を返す。
n Moduleクラス
重要らしい・・・
⽐比
n サブクラスの関係を⽰示すために⽐比較演算⼦子を実装。
n ModuleはClassのスーパークラスである。
較
n AとBの2つのクラスがあるとき、AがBのサブクラスまたは⼦子孫
なら、A
<
B
が
true
になる。このときは「より⼩小さい」では無く
「より専⾨門特化されている」、「より狭い型」という意味。
n <
⽂文字は、サブクラスの宣⾔言するときのニーモニックとしても
使われる・・・第7章であります。
n 例例)
#クラスAをクラスBのサブクラスと宣⾔言
Class
A
<
B
end
23. +
n Moduleクラス
続き・・・
!
"
. .
n Moduleは、両辺が逆になった
<
として
>
を定義している。ま
た、<=
と
>=
は、両辺が同じクラスのときも
true
を返すよう
に定義している。
"
n Module同⼠士の順序が部分的にしか定義されていない!
↑(筆者が熱くなってた・・)このような順序関係を半順序、
そうでない順序を全順序という。
⽐比
n 例例)String
と
Numeric
について
n これはどちらもObjectのサブクラスなので、⽚片⽅方がもう
較
⽚片⽅方の⼦子とか、⼦子孫という関係ではない。このように無
関係だと
nil
を返す。
n 例例)
String
<
Object
#
true
よりも専⾨門的
Object
<
Numeric
#
true
よりも⼀一般的
Numeric
<
Integer
#
false
よりも専⾨門的でない
String
<
Numeric
#
nil
無関係
25. +
等値
==,!=,=~,!~,===
n 種類
n [==]等値演算⼦子。
n [!=]==の逆。==を呼び出し、逆を返す。
n [=~]パターンマッチ演算⼦子。
n Objectは、必ずfalseを返すという形でこの演算⼦子を定義している。
n Stringは、右辺としてRegexpを取るようにこの演算⼦子を再定義し
ている。
Regexpは右辺としてStringを取るようにこの演算⼦子を再定義して
n
いる。
n どちらの演算⼦子も、⽂文字列列がパターンにマッチしなければnilを
返す。マッチしていれば、マッチの先頭位置を⽰示す整数の添字
を返す。
n [!~]=~の逆。=~を呼び出して、nilが返ってきたらtrue、整数を返
してきたらfalseを返す。
26. +
!
"
. .
種類。。。続き
%
n
n [===]“case等値”の演算⼦子。case⽂文が暗黙のうちに使う。
第5章
n ==と⽐比べて明⽰示的に使われる頻度度はかなり低い。
n Range,Class,Regexp、は⼀一種のメンバ判定演算⼦子とかパ
ターンマッチ演算⼦子としてこれを実装。
等
n 他のクラスはObjectの実装を継承して単純に==演算⼦子を呼 値
び出している。
n !==演算⼦子は無いので注意。
n ===を否定したいときは必ず⾃自分で否定の定義を書かな
ければいけない。
27. +
L O
OGICAL
PERATOR
等値
28. +
論論理理演算⼦子
&&,||,!,and,or,not
n Rubyの論論理理演算⼦子は⾔言語に組み込まれているので、メソッド
ベースではない。よって、クラスで独⾃自の論論理理演算⼦子メソッド
を定義する事は出来ない。
n これは、演算対象がどのような値でも適⽤用でき、どのような型でも
同じように動作するようにするため。
n Rubyでは論論理理型でない専⽤用のtrue,falseの値を定義している。
n 論論理理演算では、falseとnilは偽として扱う。それ以外の値は、true,
0[zero],NaN,”
”,[],{}を含め、全てを真として扱う。
n !
は例例外(!
は再定義できる)
n クラスはand,or,notという名前のメソッドを定義できる。
n これらは通常メソッドであり同名の演算⼦子の動作を変えるもの
ではない。
29. +
!
"
. .
n Rubyの論論理理演算⼦子が再定義不不可能なメソッド(⾔言語の核
の部分で定義されている)なのは、処理理の「短絡」にあ
る。
&
n 論論理理演算が左辺だけで決められる場合、右辺は無視されて、
評価さえされない。
つまり→右辺が副作⽤用を持つもの(代⼊入や副作⽤用を持つメ
論論
理理
n
ソッド呼び出しなど…)なら左辺の値次第で、その副作⽤用
演
は発⽣生しなかったりする。
n [&&]論論理理AND演算⼦子。
n 両辺が共に真なら、真の値を返す。
算
n 両辺が共に偽なら、偽の値を返す。
⼦子
※true,falseでは無く「真」、「偽」を使ってる事に注意。
n
n 例例)x
==
1
&&
y
<
1
30. +
n ⽐比較と等値は評価するときにtrue,falseの値を返す。だから、
この場合(x
==
1
&&
y
<
1)の
&&
演算⼦子は本物の値を処理理
!
"
. .
している事となる
n しかし。そのような事でない事もある。
n 例例)x
&&
y
&
この場合は x
と
y
は何でも良良い。
論論
n
n xもyも真の値なら、式の値はyの値になる。
n xが偽の値なら式の値はyになる。
理理
n &&の動作
まず左辺を評価。
演
算
n
n nill,falseなら、それをそれを&&式の全体の値として
採⽤用。
n 右辺は評価しない。
⼦子
n そうでなければ、左辺は真となる。(&&演算⼦子全
体の値は右辺次第となる。つまり右辺を評価して、
その値を返す。)。
31. +
n &&が右辺を無視する例例)
!
"
. .
n x
&&
print(
x.to_s
)
このコードは、xがnilやfalseで無いときに限り、xの値
&
n
を⽂文字列列で出⼒力力する。(※書く事は出来るが良良い式で
はない。→
print(
x.to_s
)
if
x
この⽅方が良良い)
n [||]論論理理ORを返す。
n 両辺のどちらかが真であれば真の値を返す。
論論
両辺とも偽であれば偽の値を返す。
n 理理
n ||の動作
演
n &&と同様
||は、複数の⽐比較、等値演算⼦子をつなぐための接続詞として
算
⼦子
n
使う事が出来る。
n 例例)x
<
0
||
y
<
0
||
z
<
0
#座標に負数が含まれているか?
n この場合、||が評価使⽤用とする対象は、trueかfalse。
よって結果もtrueかfalse。
32. +
n ||はtrue,false意外の値にも対応している。
n 例例)⼀一連の選択肢の中から、nilで無い最初の値を返すとき
!
"
. .
に、||はイディオム的に良良く使われる
n 例例)
#引数のxがnilであれば、ユーザー設定のハッ
#シュから値を取得し、それでもだめなら設定の
&
#デフォルト値を使う。
x
=
x
||
preference[
:
x
]
||
Defaults
::
x
n &&の⽅方が||よりも優先順位が⾼高い。事に注意
論論
n 例例)
1
||
2
&&
nil
n &&が先に実⾏行行され、この式の値は1になる。しかし次の式
#
=>
1
理理
は違う事を考えてみる。
演
n
n 例例)
(
1
||
2
)
&&
nil
[!]単項で論論理理NOTを実⾏行行
#
=>
nil
算
n !
演算⼦子は対象がnilかfalseならtrueを返し、そうで無ければ
false。
⼦子
n 優先順位が最も⾼高い演算⼦子。よって演算⼦子が使われていた
ら必ず、()を使わなくてはいけない。
n 例例)!
(
a
&&
b)
#
!
a
||
!
b これと同意(ド・モルガン)
33. +
n and,or,not
!
"
. .
n それぞれ&&、||、!
と同じ動作。
n
n
優先順位が低い。
名前が英語で読み易易い。
&
代⼊入演算⼦子より優先順位が低いので使いやすい。
論論
n
n 例例)偽の値を検出するまで変数に代⼊入する論論理理式が書ける。
if
x
>
f(x)
and
b
=
f(y)
and
c
=
f(z)
then
d
=
g(a,b,c)
end 理理
n これは、and
では無く
&&
を使うと動かなくなってしま
う。
演
n andとorの優先順位が同じなのに、&&と||の優先順位は異異な 算
るので注意。
n 例例)
⼦子
x
||
u
&&
nil
#&&が先に実⾏行行される
=>
x
x
or
y
and
nil
#左から右に評価される
=>
nil
34. +
R F F
ANGE, LIP-‐ LOP
範囲とフリップフロップ
35. +
範囲とフリップフロップ
..,…
n ..
と
…
はすでにRangeのリテラル構⽂文の⼀一部で紹介されている
n 範囲の指定。
n 範囲の先頭と末尾が整数リテラルならリテラルRangeオブジェク
トを⽣生成する。
n 式の先頭と末尾が異異なる整数リテラルよりも複雑な場合(x..
2*x)これをRangeリテラルと呼ぶのではふさわしくない。だから
範囲リテラル構⽂文では無く、演算⼦子だ!
n メソッドベースでは無いので、再定義できない。
n 優先順位が⽐比較的低い。→()で囲なくては⾏行行けない事が少ない。
n 例例)x
+
1
..
x*x
n Rangeオブジェクトである。x..yは次の呼び出しと同じ。
例例)Range.new(x,y)
n
n そして次の式は、x…yと同じになる。
n 例例)Range.new(x,y,true)
36. +
論論理理フリップフロップ
n if⽂文のように条件分岐やwhileループなどの繰り返しで使われている..,…演算⼦子はRangeオ
ブジェクトを作る訳でなく『フリップフロップ』と呼ばれる特殊な論論理理式を作る。
フリップフロップ式は状態を保持している点が⾮非常に特徴的。
何らかのオブジェクトと思われるが、これはRubyの式でありRubyインタープリタは解析
した岸野内部表現の中に必要な状態(1個の論論理理式)を格納している。
n 例例)下記のコードの最初の ..
はRangeオブジェクトを作る。フリップフロップを作ってい
るのは2個⽬目の
..
だ。
n (
1..10
).each
{
|x|
print
x
if
x
==
3..x
==
5
}
n フリップフロップはxが1から10までの値を取る間、繰り返し評価される。
最初はfalse状態でスタートし、xが1、2の時はfalseと評価、x==3になると、フリップフロッ
プはtrueにフリップし、trueを返す。xが4、5の時はtrueを返し続ける。しかし、x==5の時、
フリップフロップはfalseにフロップし。残りのxに対してはfalseを返す。そこでこのコード
は345を返す。
n フリップフロップは条件分岐や繰り返しの⽂文脈の中で、2個の論論理理式で結合したものであ
る。フリップフロップ式は左辺の式がtrueになるまでfalseであり続ける。左辺の式がtrue
になると、式は永続true状態に「フリップ(訳:弾く)」し、右辺の式がtrueと評価される
まで、その状態を保って、フリップフロップ式としてはtrueを返す。しかし、右辺の式が
trueと評価されるとフリップフロップは永続false状態に「フロップ(訳:仕損なう)」し、
左辺の式がtrueになるまで、falseを状態を返し続ける。
37. +
論論理理フリップフロップ
n フリップフロップは、..や、…でも作れるがm動作が異異なる。
n ..は、フリップフロップがfalseにフリップするときに、trueを返した
後、右辺の式をテストして内部の状態をfalseにフロップしなければ
ならないかテストするが、…形式は、次の評価まで右辺の式のテス
トを⾏行行わない。
n 例例)
#“3”と表⽰示。x==3の時にフリップし、同時にフロップする。
(
1..10
).each
{
|x|
print
x
if
x
==
3..x
>
3
}
#“34”と表⽰示。x==3のときにフリップし、x==4のときフロップす
る。
(
1..10
).each
{
|x|
print
x
if
x
==
3…x
>
3
}
38. +
論論理理フリップフロップ
n フリップフロップは⾃自分のコードではあまり使わない⽅方が良良い。
n Rubyはこの機能をPerlから受け継いでおり、PerlはUnixのテキス
ト処理理ツールである。sedやawkからこれを受け継いでいる。
n フリップフロップは元々、テキストファイルの中で開始パターン
から終了了までの⾏行行をマッチさせるために考えだされたものであり、
今でもフリップフロップが役に⽴立立つ典型的な⽤用途である。
n 例例)
ARGF.each
do
|
line
|
#標準⼊入⼒力力か指定されたファイルの
#各⾏行行について。
print
line
if
line=~/TODO/..line~/^$/
#フリップフロップが真
#の時に⾏行行を出⼒力力。
end
39. +
論論理理フリップフロップ
n フリップフロップの正確な動作を公式的に記述するのは難しい。
n 同じように動作する例例を作る。
n 例例)
x==3..x==5というフリップフロップと同じように
動作する。左端と右端の条件を関数⾃自体に埋め込ん
でいる。フリップフロップの状態を格納するために
グローバル変数を使⽤用。
$state
=
false
#状態を管理理するグローバル変数
def
flipflop(x)
#xの値をテストしてフリップフロップする関数
if
!$state
#$stateがfalseなら
result
=
(x==3)
#resultは右辺の式
if
result
#resultが真なら
$state
=
!(x==5)
#保存される$stateは右辺の逆
end
result
#resultを返す
else
#$stateが真なら
$state
=
!(x==5)
#右辺の式の逆を保存
true
#右辺をテストせずにtrueを返す
end
end
n これをもとに次のコードを書けばさっきの345が出⼒力力される
n 例例)(
1..10
).each
{
|x|
print
x
if
flipflop(x)}
40. +
論論理理フリップフロップ
n 次の関数は、ドッド3個のx==3…x>=3というフリップフロップの動作のシュミ
レート。
n 例例)
$state2
=
false
def
flipflop2(x)
if
!$state2
$state2
=
(x==3)
else
$state2
=
!(x>=3)
true
end
end
#試してみる
(
1..10
).each
{
|x|
print
x
if
x
==
3…x
>
3
}
#”34”と出⼒力力
(
1..10
).each
{
|x|
print
x
if
flipflop2(x)
}
#”34”と出⼒力力
42. +
条件
?:
n [?:]条件演算⼦子
n Ruby唯⼀一の三項演算⼦子。
n 1個⽬目→疑問符の前。
n 2個⽬目→疑問符とコロンの間。
n 3個⽬目→コロンの後。
n いつでも必ず1番⽬目の項を評価。
n 1番⽬目の項がfalseでもnilでも無ければ、式の値は2番⽬目の項になる。
n 1番⽬目の項がfalseかnilならば、式の値は、3番⽬目の項になる。
n 上記の通り、3つの項のうちの1個は評価されない。
n 例例)
“You
have
#{n}
#{
n=1
?
‘message’
:
‘messages’
}”
n コンパクトなif/while/else分のようにどうさする。
n 1番⽬目→if
の後の式と同意
n 2番⽬目→then
の後ろのコードと類似
n 3番⽬目→else
の後ろのコードと類似
n if
分との違いは、then,else節のようにコードをいくつも書けない。
(1つしか書けない)
43. +
n 優先順位が⾮非常に低い
!
"
. .
n 普通は()で囲む必要はない。
n 1番⽬目の項がdefined?か2、3番⽬目の項が代⼊入をしている
場合には()が必要になる。
'#
n 例例)Rubyでは、メソッド名の末尾で疑問符を使える。演算
⼦子の1番⽬目の項が識識別⼦子で終わっている場合、この項を
()で囲むか、その式と疑問符の間にスペースを⼊入れない
条
と⾏行行けない。(理理由:?:演算⼦子の疑問符を前の識識別⼦子の⼀一 件
部として解釈してしまう。)
x==3?y:z
#⼤大丈夫だ、問題ない。
3==x?y:z
#構⽂文エラー:x?がメソッド名と解釈
(3==x)?y:z
#⼤大丈夫だ、問題ない。
3==x
?y:z
#⼤大丈夫だ、問題ない。
上記のコードは全て構⽂文エラーなので注意。。
44. +
!
疑問符は、第1引数と同じ⾏行行でなければいけない。
"
. .
n
n コロンの前に改⾏行行を⼊入れられる。
n この場合、シンボルリテラルの導⼊入と混合を避けるため、
'#
コロンの後ろにスペースを⼊入れる必要がある。
例例)
a
?
b
:
c
?
d
:
e
#この式は↓
条
n
a
?
b
:
(
c
?
d
:
e
)
#このように評価。
n
(
a
?
b
:
c
)
?
d
:
e
例例)3個の条件演算⼦子を使って3個の変数から最⼤大値
#こうではない。
件
を呼び出す。⽂文の解析法は1つしか無いので、括弧は
不不要。(疑問符の前にスペースは必要)
max
=
x>y
?
x>z
?
x
:
z
:
y>z
?
y
:
z
max
=
x>y
?
(
x>z
?
x
:
z
)
:
(
y>z
?
y
:
z)
#明⽰示的に()を使った場合。
45. +
A SSIGNMENT
O
PERATOR
代⼊入演算⼦子
46. +
代⼊入演算⼦子
n 代⼊入演算⼦子は右結合
n 例例)2つの機能を紹介
x
=
y
=
z
=
0
#変数xyzに0を代⼊入。
x
=
(
y
=
(
z
=
0)
)
#同じ式の意味。評価の順序はこうなる。
n 評価順位は⾮非常に低い。
n 代⼊入演算⼦子はメソッドとして定義する事は出来ない。
n +=のような複合代⼊入演算⼦子は+演算⼦子と同様に再定義可能。
各々の影響に注意。
47. +
D
EFINED?
defined?演算⼦子
48. +
defined?演算⼦子
n [defined?]対象が定義されているかをテストする単項演算⼦子。
n 右側の式が未定義変数、メソッドを使ってる→nilを返す。
n yieldやsuperを不不適切切な⽂文脈で使⽤用している式である→nilを返す。
n (制御を渡すべきブロックが無いとか、呼び出すべきスーパークラス
メソッドが無い)
n 対象式は実際には評価されない。←ここポイントらしい。
n 単純にエラーを起こさず式を評価できるかどうかをチェックするだ
け。
n 例例)⼀一般的な使い⽅方。
#fとxがともに定義されているときに限り、f(x)を計算する。
y
=
f(x)
if
defined?
f(x)
n ⾮非常に優先順位が低い。
n 例例)2つの変数を定義されているかテストしたいときは&&でなく、
andを使うとよい。
defined?
a
and
defined?
b
#⼤大丈夫だ、問題ない。
defined?
a
&&
defined?
b
#defined?((a
&&
defined?
b))
と評価さ
#れてしまう。
49. 対象の式の型 戻り値
定義済みのローカル変数の参照 “local-‐variable”
定義済みのブロックローカル変数の参照(only
Ruby
1.8
) “local-‐variable(inblock)”
定義済みのグローバル変数の参照
“global-‐variable”
正規表現専⽤用グローバル変数(only
Ruby
1.8
) ⽂文字列列形式の変数の名前
定義済みの定数の参照 “constant”
定義済みインスンス変数参照 “instance-‐variable”
定義済みクラス変数の参照
“class
variable”(No
Hyphen
)
nil “nil”(⽂文字列列になってる事に注意)
true,false “true”,”false”
self “self”
制御を渡すべきブロックがあるときのyield “yield”
適切切な⽂文脈のsuper “super”
代⼊入(実際に代⼊入は実⾏行行されない)
“assignment”
メソッドとして定義されている演算⼦子を含むメソッド呼び出
し(メソッドは実際には呼び出されず、引数の数は正しくな “method”
くてもよい)
リテラル、組み込み演算⼦子など、その他有効な式 “expression”
未定義の変数、メソッド名を使っている式、あるいは不不適切切
nil
な⽂文脈で使われているyield,super
50. +
S Q
TATEMENT
UALIFIERS
⽂文修飾⼦子
51. +
⽂文修飾⼦子
n rescue,if,nuless,while,until
は、Rubyプログラムのフロー制御に
影響を与える条件分岐、繰り返し、例例以外処理理⽂文である。
n 例例)このように⽂文修飾⼦子として使⽤用できる。
print
x
if
y
n 特に役⽴立立つ事は無い。
n 優先順位は⾮非常に低いが、rescue⽂文修飾⼦子だけは代⼊入よりも優先順
位が⾼高い事に注意。
52. N A OT
N
+
O S
PERATOR
YMBOL
演算⼦子ではない記号
53. +
演算⼦子ではない記号
n ⾊色々あるのでまとめておく。
n ()
n ;
,
=>
n メソッド定義
n セパレータ
n 呼び出し構⽂文
n [;]同じ⾏行行を区切切る
n 部分式評価順序変更更
n [,]メソッド引数、配列列、ハッシュ
リテラルの要素を区切切る
n グループ化
n [=>]ハッシュリテラルでキーと値
n []
を区別する
n 配列列リテラル
n :
n 配列列とハッシュの値取得
n シンボルリテラルのプレフィックス
n メソッド呼び出しのための構⽂文糖
(訳:要素名などの先頭につけて何
らかの意味や機能などを付与する⽂文
n {}
字列列)として使⽤用
n ブロック→do/endと同意
n *
&
<
n ハッシュリテラル
n [*]代⼊入やメソッド呼び出し中の配
n .
::
列列にプレフィックスとしてつける
n 名前空間の限定使⽤用
n [&]メソッドの宣⾔言の中で、最後の
n メソッド名とメソッド呼び出し元の メソッド引数のなまえにつけて、メ
オブジェクトを区切切る
ソッドに渡されたブロックをその引
数に代⼊入できるようにする
n 定数名と定数が定義されているモ
ジュールを区切切る
n [<]クラス定義でスーパークラスを
指定するときに使⽤用
n 右辺が値ではなく識識別⼦子
54. +
題5章。⽂文と制御構造
The
following
statements
and
control
structures
Ruby
輪輪講
No.5
HIROSHI
ISHIMARU