おもしろいルビー学習ノート4

4747 ワード

Rubyブロック
ブロック、私から見れば可変の関数を挿入します.
block_name{
   statement1
   statement2
   ..........
}

何なのか分からないようですが、焦らないで、下を見続けてください.
ブロック関数はyieldで呼び出されます
yield文
yield英語は屈服して、放棄して、どうしてこの単語を使うのか分からないで、まさかここの関数が制御権を放棄したのですか?
#!/usr/bin/ruby
# -*- coding: UTF-8 -*-

def test
   puts "  test    "
   yield
   puts "      test    "
   yield
end
test {puts "    "}
このセクションを実行した後の効果は
  test    
    
      test    
    
yieldのセクションで、呼び出し時に入力されたブロック文が実行されます.
だからyieldは役に立たないように見えますか?下を見続ける
yieldはパラメータ付き
パラメータ付きyield文を渡すこともできます.次に例を示します.
#!/usr/bin/ruby
# -*- coding: UTF-8 -*-

def test
   yield 5
   puts "  test    "
   yield 100
end
test {|i| puts "    #{i}  "}

ブロックとメソッド
メソッドの最後のパラメータに&が付いている場合は、メソッドにブロックを渡すことができ、このブロックを最後のパラメータに割り当てることができます.*と&が同時にパラメータリストに表示される場合は、&を後ろに配置します.
#!/usr/bin/ruby

def test(&block)
   block.call
end
test { puts "Hello World!"}
javascriptのコールバック関数を思い出したのではないでしょうか.
上のyieldパラメータと組み合わせて、関数の実行中に入力された異なるパラメータに基づいて異なる動作を行うことができるコールバック関数を入力することができる.
どうやらブロックという特性が少し役に立ったような気がします...
BEGINとENDブロック
BEGINとENDブロックはjavaのブロックのようで、1つはbeforeブロックで、1つはafterブロックです
#!/usr/bin/ruby

BEGIN { 
  # BEGIN    
  puts "BEGIN    "
} 

END { 
  # END    
  puts "END    "
}
  # MAIN    
puts "MAIN    "
のプログラムは、複数のBEGINおよびENDブロックを含むことができる.BEGINブロックは、それらが現れる順に実行される.ENDブロックは、それらが現れる逆の順序で実行される.実行すると、上記のプログラムは次の結果を生成します.
BEGIN    
MAIN    
END    

Rubyモジュール
モジュール(Module)は、メソッド、クラス、定数を組み合わせる方法です.モジュール(Module)は、2つのメリットを提供します.
  • モジュールは、名前の競合を回避するためのネーミングスペースを提供します.
  • モジュールはmixin装置
  • を実現する.
    モジュール(Module)は、砂箱に相当するネーミングスペースを定義し、メソッドと定数が他の場所のメソッドと定数と衝突しません.
  • モジュールはクラスと似ていますが、
  • をインスタンス化できないモジュールがあります.
  • モジュールにはサブクラスがない
  • モジュールは、他のモジュールによってのみ定義される
  • module Identifier
       statement1
       statement2
       ...........
    end

    モジュール定数ネーミングは、クラス定数ネーミングと同様に大文字で始まります.メソッド定義も似ているように見えます.モジュールメソッド定義はクラスメソッド定義と似ています.
    #!/usr/bin/ruby
    
    #     trig.rb       
    
    module Trig
       PI = 3.141592654
       def Trig.sin(x)
       # ..
       end
       def Trig.cos(x)
       # ..
       end
    end

    require文
    やっとrequire文が見えてきました!require機能がないとコードが書けないみたいなので、requireと組み合わせるとmodule機能が一番重要な機能です
    ≪インスタンス|Instance|emdw≫
    $LOAD_PATH << '.'
    
    require 'trig.rb'
    
    y = Trig.sin(Trig::PI/4)
    注意この言葉$LOAD_PATH << '.' この文はrequireのパスを現在のファイルのパスに設定して、私が最初requireがいつも失敗したのはこの文がないためです
    $LOAD_を使いたくないならPATHはrequire_を使用することもできますrelativeメソッド
    require_relative 'trig.rb'
    
    y = Trig.sin(Trig::PI/4)

    いいですよ!しかも
    私はrequireのほうが好きです.relativeは覚えやすいから!
    include文
    クラスにモジュールを埋め込むことができます.あなたはきっと私と同じ疑問を持っています:“しかし、私はすべてrequireを持っていますどうしてincludeを必要としますか?!”
    次のコードをsupportに書くと仮定します.rbの中
    module Week
       FIRST_DAY = "Sunday"
       def Week.weeks_in_month
          puts "You have four weeks in a month"
       end
       def Week.weeks_in_year
          puts "You have 52 weeks in a year"
       end
    end

    埋め込みましょう
    #!/usr/bin/ruby
    $LOAD_PATH << '.'
    require "support"
    
    class Decade
    include Week
       no_of_yrs=10
       def no_of_months
          puts Week::FIRST_DAY
          number=10*12
          puts number
       end
    end
    d1=Decade.new
    puts Week::FIRST_DAY
    Week.weeks_in_month
    Week.weeks_in_year
    d1.no_of_months
    です
    その行のinclude Weekコードの実行結果があるかどうかは全然違いません!
    ではincludeにはどんな卵がありますか?!
    includeが何の役に立つかを説明するにはrubyのmixins特性を紹介します
    RubyのMixins
    ルビーでは多重継承はなく,代わりにMixinである.モジュールincludeをクラス定義に挿入すると、モジュール内のメソッドはmixによってクラスに挿入されます.
    インスタンスコード、A、BがどのようにmixにSampleの中に入るかを見てみましょう
    module A
       def a1
       end
       def a2
       end
    end
    module B
       def b1
       end
       def b2
       end
    end
    
    class Sample
    include A
    include B
       def s1
       end
    end
    
    samp=Sample.new
    samp.a1
    samp.a2
    samp.b1
    samp.b2
    samp.s1

    include & require & load
    もともとincludeとrequireには以下の違いがあります(ここではloadの方法も言及します)
  • requireは接尾辞を付ける必要がなく、xxxを自動的に認識する.rb
  • require 2回呼び出すとエラーが報告され、複数回呼び出す場合はloadが使用されますが、loadでファイル接尾辞名
  • が書かれています.
  • requireは一般的にライブラリファイルのロードに使用され、load一般ユーザーはプロファイル
  • をロードする.
  • includeは、1つのファイル内のモジュールmixをクラス内の
  • に使用する.
  • includeはmoduleのインスタンスメソッドをクラスにコピーするのではなく、参照を行っただけで、moduleを含む異なるクラスは同じオブジェクトを指しています.moduleの定義を変更すると、プログラムが実行されていても、moduleを含むすべてのクラスが動作を変更します.