おもしろいルビー学習ノート4
4747 ワード
Rubyブロック
ブロック、私から見れば可変の関数を挿入します.
何なのか分からないようですが、焦らないで、下を見続けてください.
ブロック関数はyieldで呼び出されます
yield文
yield英語は屈服して、放棄して、どうしてこの単語を使うのか分からないで、まさかここの関数が制御権を放棄したのですか?
例
だからyieldは役に立たないように見えますか?下を見続ける
yieldはパラメータ付き
パラメータ付きyield文を渡すこともできます.次に例を示します.
ブロックとメソッド
メソッドの最後のパラメータに&が付いている場合は、メソッドにブロックを渡すことができ、このブロックを最後のパラメータに割り当てることができます.*と&が同時にパラメータリストに表示される場合は、&を後ろに配置します.
上のyieldパラメータと組み合わせて、関数の実行中に入力された異なるパラメータに基づいて異なる動作を行うことができるコールバック関数を入力することができる.
どうやらブロックという特性が少し役に立ったような気がします...
BEGINとENDブロック
BEGINとENDブロックはjavaのブロックのようで、1つはbeforeブロックで、1つはafterブロックです
Rubyモジュール
モジュール(Module)は、メソッド、クラス、定数を組み合わせる方法です.モジュール(Module)は、2つのメリットを提供します.モジュールは、名前の競合を回避するためのネーミングスペースを提供します. モジュールはmixin装置 を実現する.
モジュール(Module)は、砂箱に相当するネーミングスペースを定義し、メソッドと定数が他の場所のメソッドと定数と衝突しません.モジュールはクラスと似ていますが、 をインスタンス化できないモジュールがあります.モジュールにはサブクラスがない モジュールは、他のモジュールによってのみ定義される
モジュール定数ネーミングは、クラス定数ネーミングと同様に大文字で始まります.メソッド定義も似ているように見えます.モジュールメソッド定義はクラスメソッド定義と似ています.
例
require文
やっとrequire文が見えてきました!require機能がないとコードが書けないみたいなので、requireと組み合わせるとmodule機能が一番重要な機能です
≪インスタンス|Instance|emdw≫
$LOAD_を使いたくないならPATHはrequire_を使用することもできますrelativeメソッド
いいですよ!しかも
私はrequireのほうが好きです.relativeは覚えやすいから!
include文
クラスにモジュールを埋め込むことができます.あなたはきっと私と同じ疑問を持っています:“しかし、私はすべてrequireを持っていますどうしてincludeを必要としますか?!”
次のコードをsupportに書くと仮定します.rbの中
埋め込みましょう
その行のinclude Weekコードの実行結果があるかどうかは全然違いません!
ではincludeにはどんな卵がありますか?!
includeが何の役に立つかを説明するにはrubyのmixins特性を紹介します
RubyのMixins
ルビーでは多重継承はなく,代わりにMixinである.モジュールincludeをクラス定義に挿入すると、モジュール内のメソッドはmixによってクラスに挿入されます.
インスタンスコード、A、BがどのようにmixにSampleの中に入るかを見てみましょう
include & require & load
もともとincludeとrequireには以下の違いがあります(ここではloadの方法も言及します) requireは接尾辞を付ける必要がなく、xxxを自動的に認識する.rb require 2回呼び出すとエラーが報告され、複数回呼び出す場合はloadが使用されますが、loadでファイル接尾辞名 が書かれています. requireは一般的にライブラリファイルのロードに使用され、load一般ユーザーはプロファイル をロードする. includeは、1つのファイル内のモジュールmixをクラス内の に使用する. includeはmoduleのインスタンスメソッドをクラスにコピーするのではなく、参照を行っただけで、moduleを含む異なるクラスは同じオブジェクトを指しています.moduleの定義を変更すると、プログラムが実行されていても、moduleを含むすべてのクラスが動作を変更します.
ブロック、私から見れば可変の関数を挿入します.
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つのメリットを提供します.
モジュール(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の方法も言及します)