SlideShare a Scribd company logo
1 of 54
Download to read offline
+	
  




        Ruby	
  輪輪講	
  
            No.5
                   	
  
        HIROSHI	
  ISHIMARU
+	
                        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   	
  代⼊入演算⼦子	
  
+	
  
        O
        PERATOR
            演算⼦子
+	
  
                                                        演算⼦子
        n    演算⼦子(operators)とは、1個以上のオペランドを対象とし
              て実⾏行行される演算を表すRuby⾔言語のトークンである。演算⼦子
              はこれらの式を結合して⼤大きな式を作る。	
  

        n    例例)	
  
              n     数値リテラル2と演算⼦子+を組み合わせて「2+2」という式を作
                     る。	
  
              n     2	
  *	
  Math.sprt(2)	
  <	
  limit	
  
              	
  
              数値リテラル      変数参照式	
  
                            	
  メソッド呼び出し式	
  
              それぞれを乗算演算⼦子、より⼩小さいの2つの演算⼦子で結合している。	
  
+	
  
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)とは同じ演算⼦子、または同じ優先
      順位の演算⼦子が⼀一つの式の中に並んでいるときの評価基準である。	
  
+	
  
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  例例えば、+演算⼦子は数値の加算を⾏行行うので数値演算⼦子に分類されてい
                るが、⽂文字列列や配列列の結合にも使われる。メソッドベースの演算⼦子は、
                演算⼦子の左に出現するオブジェクトのメソッドとして起動される。残
                りの演算対象は、メソッドの引数として渡される。メソッドベースの
                演算⼦子のクラスによる定義は、同じクラスの他のメソッドと同じよう
                に探索索される。	
  
演算⼦子                                  項数   結合性   再定義   演算
!	
  ~	
  +                           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    無     ×     条件分枝    繰り返し修飾⼦子
+	
  
        U
        NARY
            単項
+	
  
                                  単項	
  +,-­‐
        n    単項マイナス	
  
              n    数値の引数を変更更する。	
  
              n    単項のプラスも認められているが、数値には何の影響も無い。	
  
                    n    単項マイナスと対称性を保ために⽤用意されているもので、再定義
                          も可能。+とーでは優先順位はやや“ー”のほうが低い。	
  

        n    メソッド名	
  
              n    -­‐@、+@	
  
                    n    演算⼦子の再定義、メソッド形式での呼び出し、演算⼦子のドキュメ
                          ントの探索索などで必要となる	
  
+	
  
        I   NDEX
              指数
+	
  
                                     指数:**
        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と評価される。	
  
+	
  
        A                O
            RITHEMETIC	
     PERATOR
                               算術演算⼦子	
  
+	
  
               算術演算⼦子+,-­‐,*,/,%
        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メソッ
                        ドを呼び出したのと同意である。	
  
+	
  
        A S
         DD,	
        HIFT
                   シフトと追加	
  
+	
  
              シフトと追加<<,>>
        n    Fixnum,Bignumクラス	
  
              n    左辺の引数のビットを左右にシフトする演算子として<<,>>を実装。	
  
              n    右辺の引数は、シフトするビット数で、負数を指定すると逆にシフ
                    トする。	
  
                    n  例例)−2ビット左シフト  =  2ビット右シフト	
  

              n    Fixnumの左シフトは、最上位ビットが「シフトオフ」する事は無い。	
  
              n    シフト結果がFixnumに収まらない時はBignumの値が返される。	
  
              n    右シフトは引数の最下位ビットを必ず捨てる。	
  
                    n    意味)Rubyには	
  unsigned	
  int	
  のような物は無い。シフトはいつも
                          算術シフト。負の数は上位に無限に1のビットがたってると⾒見見な
                          してよく、従って負の数に対する右シフトは上位ビットが⽴立立った
                          まま残る。	
  
+	
  
                                                                                                                             !
                                                                                                                             "




                                                                                                                             . .
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                       	
  
                                                                       	
  #	
  配列列に⽂文字列列を追加	
  
                                                                       	
  #	
  標準出⼒力力ストリームに出⼒力力	
  
                                                                                                                             加
                                                                                                                               
+	
  
        C   OMPLEMENT,B     IT
                     補数、ビット	
  
+	
  
               補数、ビット単位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”	
  
+	
  
                                                    !
                                                    "




                                                    . .
n    続き。。。	
  
      n    他のクラスでも使⽤用できる。(クラスによるぶれは出てく               
                                                    $
            る。)	
  
            n    [配列列]&で積集合。|で和集合。	
  
                                                    補
n    TrueClass,FalseClass,NilClass	
               数、
            論論理理演算⼦子として使えるようにするため,	
  &,|,^を定義してい
                                                    ビ
      n 
            る(~	
  は定義なし)	
  
      n    これらの演算⼦子を使うのが正しい場合は少ない。論論理理演算に
            は、論論理理演算⼦子の&&,||が⽤用意されている。そして、これらの
            演算⼦子は、演算の結果に影響が無ければ右辺を評価しないよ            ト
            うに作られているので効率率率的。	
                      単
                                                    位
+	
  
        C   omparison
                   ⽐比較	
  
+	
  
                    ⽐比較	
  <,<=,>,>=,<=>

        n    ⼀一部のクラスはクラスのに属する⾃自然な順序が定義してある。	
  
              n    数値          	
      	
  ⼤大⼩小	
  
              n    ⽂文字列列       	
      	
  アルファベット順	
  
              n    ⽇日付         	
      	
  時系列列順	
  

        n    2つの値の相対的な順序を判断する。	
  
              n    ⾔言ってる事が正しい 	
  true	
  
              n    ⾏行行ってる事が異異なる 	
  false	
  
              n    ※  引数の型に互換性が無ければ、⼀一般的に例例外を起こす	
  
+	
  
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	
  
+	
  
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   	
  無関係	
  
+	
  
        E
        QUIVALANCE
                等値	
  
+	
  
              等値	
  ==,!=,=~,!~,===
        n    種類	
  
              n    [==]等値演算⼦子。	
  
              n    [!=]==の逆。==を呼び出し、逆を返す。	
  
              n    [=~]パターンマッチ演算⼦子。	
  
                    n  Objectは、必ずfalseを返すという形でこの演算⼦子を定義している。	
  

                    n    Stringは、右辺としてRegexpを取るようにこの演算⼦子を再定義し
                          ている。	
  
                     Regexpは右辺としてStringを取るようにこの演算⼦子を再定義して
                    n 
                     いる。	
  
                     n  どちらの演算⼦子も、⽂文字列列がパターンにマッチしなければnilを
                         返す。マッチしていれば、マッチの先頭位置を⽰示す整数の添字
                         を返す。	
  
              n    [!~]=~の逆。=~を呼び出して、nilが返ってきたらtrue、整数を返
                    してきたらfalseを返す。	
  
+	
  
                                                               !
                                                               "




                                                               . .
      種類。。。続き	
  
                                                                 
                                                               %
n 
      n    [===]“case等値”の演算⼦子。case⽂文が暗黙のうちに使う。 	
       第5章


            n  ==と⽐比べて明⽰示的に使われる頻度度はかなり低い。	
  

            n    Range,Class,Regexp、は⼀一種のメンバ判定演算⼦子とかパ
                  ターンマッチ演算⼦子としてこれを実装。	
  
                                                               等
            n    他のクラスはObjectの実装を継承して単純に==演算⼦子を呼              値
                                                                 




                                                                 
                  び出している。	
  
            n    !==演算⼦子は無いので注意。	
  
                  n    ===を否定したいときは必ず⾃自分で否定の定義を書かな
                        ければいけない。	
  
+	
  
        L        O
        OGICAL	
     PERATOR
                          等値	
  
+	
  
              論論理理演算⼦子	
  &&,||,!,and,or,not

        n    Rubyの論論理理演算⼦子は⾔言語に組み込まれているので、メソッド
              ベースではない。よって、クラスで独⾃自の論論理理演算⼦子メソッド
              を定義する事は出来ない。	
  
              n    これは、演算対象がどのような値でも適⽤用でき、どのような型でも
                    同じように動作するようにするため。	
  

        n    Rubyでは論論理理型でない専⽤用のtrue,falseの値を定義している。	
  
              n    論論理理演算では、falseとnilは偽として扱う。それ以外の値は、true,
                    0[zero],NaN,”	
  ”,[],{}を含め、全てを真として扱う。	
  
                    n    !	
  は例例外(!	
  は再定義できる)	
  
                    n    クラスはand,or,notという名前のメソッドを定義できる。	
  
                          n    これらは通常メソッドであり同名の演算⼦子の動作を変えるもの
                                ではない。	
  
+	
  
                                                               !
                                                               "




                                                               . .
n    Rubyの論論理理演算⼦子が再定義不不可能なメソッド(⾔言語の核
      の部分で定義されている)なのは、処理理の「短絡」にあ
      る。	
                                                       
                                                               &
      n    論論理理演算が左辺だけで決められる場合、右辺は無視されて、
            評価さえされない。	
  
                  つまり→右辺が副作⽤用を持つもの(代⼊入や副作⽤用を持つメ
                                                               論論
                                                               理理
            n 
                  ソッド呼び出しなど…)なら左辺の値次第で、その副作⽤用

                                                               演
                  は発⽣生しなかったりする。	
  
      n    [&&]論論理理AND演算⼦子。	
  
            n    両辺が共に真なら、真の値を返す。	
                           算
            n    両辺が共に偽なら、偽の値を返す。	
                           ⼦子
                                                                 
                        ※true,falseでは無く「真」、「偽」を使ってる事に注意。	
  




                                                                 
                  n 

            n    例例)x	
  ==	
  1	
  &&	
  y	
  <	
  1	
  
+	
  
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  そうでなければ、左辺は真となる。(&&演算⼦子全
                    体の値は右辺次第となる。つまり右辺を評価して、
                    その値を返す。)。	
  
+	
  
      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。	
  
+	
  
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  これと同意(ド・モルガン)	
  
+	
  
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	
  
+	
  
        R F F
         ANGE,     LIP-­‐   LOP
                 範囲とフリップフロップ	
  
+	
  
         範囲とフリップフロップ	
  ..,…
        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)	
  
+	
  
        論論理理フリップフロップ
        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を状態を返し続ける。	
  
+	
  
        論論理理フリップフロップ
        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	
  }	
  
+	
  
        論論理理フリップフロップ
        n    フリップフロップは⾃自分のコードではあまり使わない⽅方が良良い。	
  
              n  Rubyはこの機能をPerlから受け継いでおり、PerlはUnixのテキス
                  ト処理理ツールである。sedやawkからこれを受け継いでいる。	
  
              n  フリップフロップは元々、テキストファイルの中で開始パターン
                  から終了了までの⾏行行をマッチさせるために考えだされたものであり、
                  今でもフリップフロップが役に⽴立立つ典型的な⽤用途である。	
  
                  n  例例)	
  

                	
  ARGF.each	
  do	
  |	
  line	
  |    	
  #標準⼊入⼒力力か指定されたファイルの	
  
                	
         	
                  	
        	
  #各⾏行行について。	
  
                	
  print	
  line	
  if	
  line=~/TODO/..line~/^$/   	
  #フリップフロップが真	
  
                	
                	
               	
       	
       	
  #の時に⾏行行を出⼒力力。	
  
                	
  end	
  
+	
  
        論論理理フリップフロップ
        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)}	
  
+	
  
        論論理理フリップフロップ
        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”と出⼒力力	
  
              	
  
+	
  
        C   ONDITIONS
                   条件	
  
+	
  
                                               条件	
  ?:
        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つしか書けない)	
  
+	
  
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 	
   	
  #⼤大丈夫だ、問題ない。	
  
            	
  
            上記のコードは全て構⽂文エラーなので注意。。	
  
+	
  
                                                                                                                                                             !
      疑問符は、第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)	
  
                   #明⽰示的に()を使った場合。	
  
                   	
  
+	
  
        A   SSIGNMENT	
     O
                            PERATOR
                                代⼊入演算⼦子	
  
+	
  
                                   代⼊入演算⼦子
        n    代⼊入演算⼦子は右結合	
  
              n    例例)2つの機能を紹介	
  
                    	
  
                    x	
  	
  =	
  	
  y	
  	
  =	
  	
  z	
  	
  =	
  	
  0         	
  #変数xyzに0を代⼊入。	
  
                    x	
  	
  =	
  (	
  y	
  	
  =	
  (	
  z	
  	
  =	
  	
  0)	
  ) 	
  #同じ式の意味。評価の順序はこうなる。	
  
              n    評価順位は⾮非常に低い。	
  
              n    代⼊入演算⼦子はメソッドとして定義する事は出来ない。	
  
              n    +=のような複合代⼊入演算⼦子は+演算⼦子と同様に再定義可能。	
  
                    各々の影響に注意。	
  
+	
  
        D
        EFINED?
        defined?演算⼦子	
  
+	
  
                           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))	
  と評価さ
                                                         	
           	
     	
  #れてしまう。	
  
対象の式の型                                        戻り値

定義済みのローカル変数の参照                                “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
+	
  
        S              Q
            TATEMENT	
     UALIFIERS
                                ⽂文修飾⼦子	
  
+	
  
                              ⽂文修飾⼦子	
  

        n    rescue,if,nuless,while,until	
  は、Rubyプログラムのフロー制御に
              影響を与える条件分岐、繰り返し、例例以外処理理⽂文である。	
  
              n    例例)このように⽂文修飾⼦子として使⽤用できる。	
  
                    	
  
                    print	
  x	
  if	
  y	
  
                    	
  
              n    特に役⽴立立つ事は無い。	
  
              n    優先順位は⾮非常に低いが、rescue⽂文修飾⼦子だけは代⼊入よりも優先順
                    位が⾼高い事に注意。	
  
N A             OT	
     N	
  	
  
+	
  
           O S
        	
     PERATOR	
        YMBOL
                         演算⼦子ではない記号	
  
+	
  
        演算⼦子ではない記号	
  
        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            右辺が値ではなく識識別⼦子	
  
+	
  


                  題5章。⽂文と制御構造

                  The	
  following	
  
                  statements	
  and	
  
                  control	
  structures


        Ruby	
  輪輪講	
  
            No.5
                   	
  
        HIROSHI	
  ISHIMARU

More Related Content

Featured

2024 State of Marketing Report – by Hubspot
2024 State of Marketing Report – by Hubspot2024 State of Marketing Report – by Hubspot
2024 State of Marketing Report – by HubspotMarius Sescu
 
Everything You Need To Know About ChatGPT
Everything You Need To Know About ChatGPTEverything You Need To Know About ChatGPT
Everything You Need To Know About ChatGPTExpeed Software
 
Product Design Trends in 2024 | Teenage Engineerings
Product Design Trends in 2024 | Teenage EngineeringsProduct Design Trends in 2024 | Teenage Engineerings
Product Design Trends in 2024 | Teenage EngineeringsPixeldarts
 
How Race, Age and Gender Shape Attitudes Towards Mental Health
How Race, Age and Gender Shape Attitudes Towards Mental HealthHow Race, Age and Gender Shape Attitudes Towards Mental Health
How Race, Age and Gender Shape Attitudes Towards Mental HealthThinkNow
 
AI Trends in Creative Operations 2024 by Artwork Flow.pdf
AI Trends in Creative Operations 2024 by Artwork Flow.pdfAI Trends in Creative Operations 2024 by Artwork Flow.pdf
AI Trends in Creative Operations 2024 by Artwork Flow.pdfmarketingartwork
 
PEPSICO Presentation to CAGNY Conference Feb 2024
PEPSICO Presentation to CAGNY Conference Feb 2024PEPSICO Presentation to CAGNY Conference Feb 2024
PEPSICO Presentation to CAGNY Conference Feb 2024Neil Kimberley
 
Content Methodology: A Best Practices Report (Webinar)
Content Methodology: A Best Practices Report (Webinar)Content Methodology: A Best Practices Report (Webinar)
Content Methodology: A Best Practices Report (Webinar)contently
 
How to Prepare For a Successful Job Search for 2024
How to Prepare For a Successful Job Search for 2024How to Prepare For a Successful Job Search for 2024
How to Prepare For a Successful Job Search for 2024Albert Qian
 
Social Media Marketing Trends 2024 // The Global Indie Insights
Social Media Marketing Trends 2024 // The Global Indie InsightsSocial Media Marketing Trends 2024 // The Global Indie Insights
Social Media Marketing Trends 2024 // The Global Indie InsightsKurio // The Social Media Age(ncy)
 
Trends In Paid Search: Navigating The Digital Landscape In 2024
Trends In Paid Search: Navigating The Digital Landscape In 2024Trends In Paid Search: Navigating The Digital Landscape In 2024
Trends In Paid Search: Navigating The Digital Landscape In 2024Search Engine Journal
 
5 Public speaking tips from TED - Visualized summary
5 Public speaking tips from TED - Visualized summary5 Public speaking tips from TED - Visualized summary
5 Public speaking tips from TED - Visualized summarySpeakerHub
 
ChatGPT and the Future of Work - Clark Boyd
ChatGPT and the Future of Work - Clark Boyd ChatGPT and the Future of Work - Clark Boyd
ChatGPT and the Future of Work - Clark Boyd Clark Boyd
 
Getting into the tech field. what next
Getting into the tech field. what next Getting into the tech field. what next
Getting into the tech field. what next Tessa Mero
 
Google's Just Not That Into You: Understanding Core Updates & Search Intent
Google's Just Not That Into You: Understanding Core Updates & Search IntentGoogle's Just Not That Into You: Understanding Core Updates & Search Intent
Google's Just Not That Into You: Understanding Core Updates & Search IntentLily Ray
 
Time Management & Productivity - Best Practices
Time Management & Productivity -  Best PracticesTime Management & Productivity -  Best Practices
Time Management & Productivity - Best PracticesVit Horky
 
The six step guide to practical project management
The six step guide to practical project managementThe six step guide to practical project management
The six step guide to practical project managementMindGenius
 
Beginners Guide to TikTok for Search - Rachel Pearson - We are Tilt __ Bright...
Beginners Guide to TikTok for Search - Rachel Pearson - We are Tilt __ Bright...Beginners Guide to TikTok for Search - Rachel Pearson - We are Tilt __ Bright...
Beginners Guide to TikTok for Search - Rachel Pearson - We are Tilt __ Bright...RachelPearson36
 

Featured (20)

2024 State of Marketing Report – by Hubspot
2024 State of Marketing Report – by Hubspot2024 State of Marketing Report – by Hubspot
2024 State of Marketing Report – by Hubspot
 
Everything You Need To Know About ChatGPT
Everything You Need To Know About ChatGPTEverything You Need To Know About ChatGPT
Everything You Need To Know About ChatGPT
 
Product Design Trends in 2024 | Teenage Engineerings
Product Design Trends in 2024 | Teenage EngineeringsProduct Design Trends in 2024 | Teenage Engineerings
Product Design Trends in 2024 | Teenage Engineerings
 
How Race, Age and Gender Shape Attitudes Towards Mental Health
How Race, Age and Gender Shape Attitudes Towards Mental HealthHow Race, Age and Gender Shape Attitudes Towards Mental Health
How Race, Age and Gender Shape Attitudes Towards Mental Health
 
AI Trends in Creative Operations 2024 by Artwork Flow.pdf
AI Trends in Creative Operations 2024 by Artwork Flow.pdfAI Trends in Creative Operations 2024 by Artwork Flow.pdf
AI Trends in Creative Operations 2024 by Artwork Flow.pdf
 
Skeleton Culture Code
Skeleton Culture CodeSkeleton Culture Code
Skeleton Culture Code
 
PEPSICO Presentation to CAGNY Conference Feb 2024
PEPSICO Presentation to CAGNY Conference Feb 2024PEPSICO Presentation to CAGNY Conference Feb 2024
PEPSICO Presentation to CAGNY Conference Feb 2024
 
Content Methodology: A Best Practices Report (Webinar)
Content Methodology: A Best Practices Report (Webinar)Content Methodology: A Best Practices Report (Webinar)
Content Methodology: A Best Practices Report (Webinar)
 
How to Prepare For a Successful Job Search for 2024
How to Prepare For a Successful Job Search for 2024How to Prepare For a Successful Job Search for 2024
How to Prepare For a Successful Job Search for 2024
 
Social Media Marketing Trends 2024 // The Global Indie Insights
Social Media Marketing Trends 2024 // The Global Indie InsightsSocial Media Marketing Trends 2024 // The Global Indie Insights
Social Media Marketing Trends 2024 // The Global Indie Insights
 
Trends In Paid Search: Navigating The Digital Landscape In 2024
Trends In Paid Search: Navigating The Digital Landscape In 2024Trends In Paid Search: Navigating The Digital Landscape In 2024
Trends In Paid Search: Navigating The Digital Landscape In 2024
 
5 Public speaking tips from TED - Visualized summary
5 Public speaking tips from TED - Visualized summary5 Public speaking tips from TED - Visualized summary
5 Public speaking tips from TED - Visualized summary
 
ChatGPT and the Future of Work - Clark Boyd
ChatGPT and the Future of Work - Clark Boyd ChatGPT and the Future of Work - Clark Boyd
ChatGPT and the Future of Work - Clark Boyd
 
Getting into the tech field. what next
Getting into the tech field. what next Getting into the tech field. what next
Getting into the tech field. what next
 
Google's Just Not That Into You: Understanding Core Updates & Search Intent
Google's Just Not That Into You: Understanding Core Updates & Search IntentGoogle's Just Not That Into You: Understanding Core Updates & Search Intent
Google's Just Not That Into You: Understanding Core Updates & Search Intent
 
How to have difficult conversations
How to have difficult conversations How to have difficult conversations
How to have difficult conversations
 
Introduction to Data Science
Introduction to Data ScienceIntroduction to Data Science
Introduction to Data Science
 
Time Management & Productivity - Best Practices
Time Management & Productivity -  Best PracticesTime Management & Productivity -  Best Practices
Time Management & Productivity - Best Practices
 
The six step guide to practical project management
The six step guide to practical project managementThe six step guide to practical project management
The six step guide to practical project management
 
Beginners Guide to TikTok for Search - Rachel Pearson - We are Tilt __ Bright...
Beginners Guide to TikTok for Search - Rachel Pearson - We are Tilt __ Bright...Beginners Guide to TikTok for Search - Rachel Pearson - We are Tilt __ Bright...
Beginners Guide to TikTok for Search - Rachel Pearson - We are Tilt __ Bright...
 

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  代⼊入演算⼦子  
  • 3. +   O PERATOR 演算⼦子
  • 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 無 × 条件分枝    繰り返し修飾⼦子
  • 8. +   U NARY 単項
  • 9. +   単項  +,-­‐ n  単項マイナス   n  数値の引数を変更更する。   n  単項のプラスも認められているが、数値には何の影響も無い。   n  単項マイナスと対称性を保ために⽤用意されているもので、再定義 も可能。+とーでは優先順位はやや“ー”のほうが低い。   n  メソッド名   n  -­‐@、+@   n  演算⼦子の再定義、メソッド形式での呼び出し、演算⼦子のドキュメ ントの探索索などで必要となる  
  • 10. +   I NDEX 指数
  • 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  これらの演算⼦子を使うのが正しい場合は少ない。論論理理演算に は、論論理理演算⼦子の&&,||が⽤用意されている。そして、これらの 演算⼦子は、演算の結果に影響が無ければ右辺を評価しないよ ト うに作られているので効率率率的。   単 位
  • 20. +   C omparison ⽐比較  
  • 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  無関係  
  • 24. +   E QUIVALANCE 等値  
  • 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”と出⼒力力    
  • 41. +   C ONDITIONS 条件  
  • 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