[解決済み】Rubyのブロックとイールド
2022-04-14 06:19:17
質問
ブロックを理解しようとしているのですが
yield
と、それらがRubyでどのように動作するのかを説明します。
はどのように
yield
を使用していますか?私が見てきた多くのRailsアプリケーションでは
yield
を変な意味で使っています。
誰か説明してくれるか、どこをどうすれば理解できるかを教えてください。
どのように解決するのですか?
そうですね、最初はちょっと戸惑いますね。
Rubyでは、メソッドは任意のコードのセグメントを実行するために、コードブロックを受け取ることができます。
メソッドがブロックを期待する場合、そのブロックを呼び出すために
yield
関数を使用します。
例
取る
Person
を持つクラスは
name
属性と
do_with_name
メソッドを使用します。このメソッドが呼び出されたとき
name
属性をブロックに追加します。
class Person
def initialize( name )
@name = name
end
def do_with_name # expects a block
yield( @name ) # invoke the block and pass the `@name` attribute
end
end
さて、このメソッドを呼び出して、任意のコードブロックを渡すことができます。
person = Person.new("Oscar")
# Invoking the method passing a block to print the value
person.do_with_name do |value|
puts "Got: #{value}"
end
印刷されるでしょう。
Got: Oscar
このブロックは、パラメータとして
value
. このコードで
yield
の値を引数として渡します。
@name
.
yield( @name )
同じメソッドを別のブロックで呼び出すことができます。
例えば、名前を反転させるなど。
reversed_name = ""
# Invoke the method passing a different block
person.do_with_name do |value|
reversed_name = value.reverse
end
puts reversed_name
=> "racsO"
その他、もっと面白い実例を紹介します。
配列の要素をフィルタリングする。
days = ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday"]
# Select those which start with 'T'
days.select do | item |
item.match /^T/
end
=> ["Tuesday", "Thursday"]
または名前の長さでソートする。
days.sort do |x,y|
x.size <=> y.size
end
=> ["Monday", "Friday", "Tuesday", "Thursday", "Wednesday"]
ブロックがオプションである場合は使用できます。
yield(value) if block_given?
オプションでない場合は、そのまま起動します。
これらの例をコンピュータ上で試すには
irb
(
対話型Rubyシェル
)
ここに、コピー&ペースト可能なフォームのすべての例があります。
class Person
def initialize( name )
@name = name
end
def do_with_name # expects a block
yield( @name ) # invoke the block and pass the `@name` attribute
end
end
person = Person.new("Oscar")
# Invoking the method passing a block to print the value
person.do_with_name do |value|
puts "Got: #{value}"
end
reversed_name = ""
# Invoke the method passing a different block
person.do_with_name do |value|
reversed_name = value.reverse
end
puts reversed_name
# Filter elements in an array:
days = ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday"]
# Select those which start with 'T'
days.select do | item |
item.match /^T/
end
# Sort by name length:
days.sort do |x,y|
x.size <=> y.size
end
関連
-
[解決済み】Ruby: 特定のバージョンのruby gemをインストールする方法は?
-
[解決済み] Rubyのswitch文の書き方
-
[解決済み] Rubyで配列に値が存在するかどうかを確認する方法
-
[解決済み] Rubyからシェルコマンドを呼び出す方法
-
[解決済み] Rubyでnilとemptyとblankを理解する方法
-
[解決済み] Rubyのattr_accessorとは何ですか?
-
[解決済み] イコール、エクル、==、==の違いは何ですか?
-
[解決済み] RubyのハッシュオブジェクトをJSONに変換する方法は?
-
[解決済み】rubyで文字列をシンボル化できるように変換する。
-
[解決済み】RubyにあってPythonにないもの、またその逆は何ですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] Rubyのメソッド'to_sym'は何をするのですか?
-
[解決済み] -bashです。/Users/myname/.bash_profile: パーミッションが拒否されました
-
[解決済み] ルビーオールウェイズ ラウンドアップ
-
[解決済み] ルビー階乗関数
-
[解決済み] Ruby、スタックレベルが深すぎる (SystemStackError)
-
[解決済み] string literal in condition "とはどういう意味ですか?
-
[解決済み] Rubyで=~と/Θはどういう意味ですか?
-
[解決済み] Ruby Net::HTTPの実行期限が切れた
-
[解決済み] Rubyでfailキーワードは何をするのですか?
-
[解決済み] OpenSSL AES-256-CBC 暗号化エラー、"間違った最終ブロック長" Ruby