- ベストアンサー
【ruby】無名関数?でブロック付きメソッドって作れませんか?
Proc.new do|arg| arg.each do |x| puts x end end.call([1,2,3,4,5]) 上記のようなものを無名関数と理解しているのですが、 これを下記の様にすると、 Proc.new {|arg| arg.each do |x| yield(x) end }.call([1,2,3,4,5]) do |x| puts x end no block given とエラーになってしまいます。 無名関数で、ブロック付きメソッドって作れないものでしょうか? ご指導の程、宜しくお願いいたします。
- 小林 K太郎(@kingfruits)
- お礼率66% (211/319)
- Ruby
- 回答数4
- ありがとう数14
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
lambda do |arg, &block| arg.each do |x| block.call(x) end end.call([1,2,3,4,5]) do |x| puts x end こんな感じでどうでしゅうか?Proc.newの変わりにlambda使ってますが、procでも同じです。
その他の回答 (3)
- toby_jp
- ベストアンサー率75% (6/8)
何度もすいません。追記です。 Proc.new=lambda=proc見たいな感じでつかってしまいまいたが、 細かい挙動は違いますので注意してください。 誤解を与えそうだったので・・・。 ↓以下を参考にして下さい。 Ruby Proc.newとlambdaの違い(追記) - ソースコード備忘録 http://d.hatena.ne.jp/yuki_rinrin/20090831/1251704735
- toby_jp
- ベストアンサー率75% (6/8)
書き忘れてました。 コードが、ちょっと不自然な感じがする?ので、 もしよければどんなことがしたいか言っていただいたほうがいいかもしれません。 もっとスマートな方法が見つかるかと思います。
- ryu_chan
- ベストアンサー率37% (69/186)
Ruby1.9ならブロック引数(&block)を明示してcallすればできます。 Proc.new {|arg, &block| arg.each do |x| block.(x) end }.([1,2,3,4,5]) do |x| puts x end
お礼
ryu_chanさん、ご回答有難うございます。 知らいない文法なので、まだ感覚的に馴染めませんが、 勉強になりました。
関連するQ&A
- 【ruby】【文法?】ブロックをbreakした時。。
質問を見ていただいて有難うございます。 質問を一言で言うと、 「メソッドの中で呼び出し元がbreakを使った事を検知できるか?」 となるのでしょうか。。。以下に詳しく質問を記述いたします。 引数に配列を渡すと、その配列をブロックに一つずつ返してくれる メソッドhoge()があるとします。 以下の様に使います。 ------------------------------------- hoge([0,1,2]) do |x| puts x end 実行結果 0 1 2 ------------------------------------- このhoge()は、実行中にエラーが発生した場合、トラップして falseを返す事とします。(何事もなければtrueを返します。) このhoge()を以下の様に書きました。 def hoge(arg) begin arg.each do |x| yield x end rescue false else true end end 以下の様に使います。 ------------------------------------- ret=hoge([0,1,2]) do |x| puts x end puts ret ? 'success' : 'fail' 実行結果 0 1 2 success ------------------------------------- ------------------------------------- ret=hoge(nil) do |x| puts x end puts ret ? 'success' : 'fail' 実行結果 fail ------------------------------------- ここまでは、よかったのですが、hoge()のブロックの中で、breakを使うと hoge()の戻り値はnilになってしまいます。 ------------------------------------- ret=hoge([0,1,2]) do |x| break if x==1 puts x end puts ret puts ret ? 'success' : 'fail' 実行結果 0 nil fail ------------------------------------- ここで質問です。 最後の例は、hoge()として異常系ではないので、retにtrueを与えたいのですが、どうしたらよいでしょうか? ご指導のほど、宜しくお願いいたします。
- ベストアンサー
- Ruby
- 【ruby】二つのブロック付きメソッドをif文で使い分けたい
二つのブロック付きメソッドhogeとpiyoがあるとします。 ブロックの中に記述するプログラムは同じだが、hogeを使うか、piyoを使うかは条件により制御したいです。 このような場合、どのように書いたら簡素になるでしょうか? sw=true if sw then hoge() do |x| puts x done else piyo() do |x| puts x done end 上記例では冗長の思うのですが、ご指導のほど宜しくお願いいたします。
- ベストアンサー
- Ruby
- rubyでのproc
rubyでのproc http://d.hatena.ne.jp/shunsuk/20090101/1230816826 ここのサイトで解説されていることなんですけど, 「同じblockを何度も使いたいときがあります。そんなときに再利用するためのコードがProcです。blockとProcの唯一の違いは、blockは保存できないということです。Procについて見てみましょう。」 とあるのですが,なにをもってblockは保存できないといってるのでしょうか? 「lambdaはメソッドと同じように振る舞いますから、returnを使うことができます。この意味の違いは、下の例に現れます。」 の下にサンプルプログラムがあると思いますが, puts generic_return(Proc.new { |x, y| x + 2; y + 2 }) puts generic_return(Proc.new { |x, y| [x + 2, y + 2] }) この2行ではエラー処理が行われず,なんらかの出力がされています, これはなぜでしょうか?メソッドの中にreturnがある限りエラー処理が起こると思っているのですが・・・ あと,あまり関係ない質問になるかもしれませんが array.iterate!(method(:square)) このような記述のとき,squareは関数名ということはわかるのですが, :(コロン)これはなにを指すのでしょうか? よろしくおねがいします.
- ベストアンサー
- Ruby
- Ruby 自作メソッドのブロック付きメソッドについ
いつも、ご教授ありがとうございます。 Ruby でメソッドを自作してそのメソッドにブロックを持たせる場合 ブロック内で返り値を返すためにはどうしたらいいのでしょうか? たとえば以下のような自作メソッドがあるとすると def blocktest(str) if (block_given?) yield str else print "メソッドにブロックが与えられていない"; end end begin #自作したメソッドにブロックを与えた場合 res = blocktest("ブロック付きメソッドのテスト") {|value| print value; print "<br/>" print "メソッドに与えられた引数をprintしています" return "ブロックで返り値" } print res; print "<hr />" #ブロックを与えない場合 blocktest("ブロック付きメソッドのテスト"); rescue => ex print ex.message end 上記のようにブロック内で返り値 を指定して変数resのその返り値を返したい場合 どうしたらいいのでしょうか? 一応、ブロック内でreturnで値を与えてはいますが、例外が発生します。 よろしくお願いしまう。
- ベストアンサー
- Ruby
- Ruby 文法 ブロックの中で メソッドを呼ぶ
class Hoge def val 'aaa' end def piyo yield end end h=Hoge.new h.piyo do p h.val #<ーここの話 end 上の様に書く時、ブロックの中で、そのクラスのメソッドを呼ぶ時、上の例だと h.val と書いてますが、これself.valなどと書きたいのですがERRになってしまいます。 h.と書くのがとても嫌なのですが、なにか良い書き方あるのでしょうか?
- ベストアンサー
- Ruby
- Ruby 文法 ブロックの中で自クラスの定数を呼ぶ
以前した質問(http://okwave.jp/qa/q8484921.html)と非常に似てる質問になります。 以前の質問ではブロックの中で、そのクラスのメソッドを呼ぶ時のことでしたが、今回はメソッドではなく、定数にアクセスする時の質問です。 class Hoge VAL=1 def piyo yield end end h=Hoge.new h.piyo do |this| puts Hoge::VAL #<ーココの話 end 上の様に書く時、ブロックの中で、そのクラスの中の定数を参照するとき、上の例だと Hoge::VAL と書いてますが、Hoge::と書くのがとても嫌なので、以下の様に書いてみました。 class Hoge VAL=1 def piyo yield self end def retVal VAL end end h=Hoge.new h.piyo do |this| puts this.retVal #<-Hoge::VALと書かなくてよくなった。 end が、しかし実はVALなどの定数は多数あり、その数の分だけ値を返すメソッドを書くなんて、もっと嫌です。 なんか良い書き方はあるのでしょうか? 以下、蛇足なのですが、そもそもクラスの中でしかアクセスしないマジックナンバー的な定数の定義の仕方が間違っているのでしょうか? moduleに定義して、クラスの中とブロック使うところでincludeするなどの方がスッキリするのかも。。
- ベストアンサー
- Ruby
- ruby undefined method
class Hoge def body "aaa" end end def up(arg) arg.upcase end res=Hoge.new res.body = up(res.body) puts res.body 上記を実行すると、undefined method `body=' for #<Hoge:0x2b36454> (NoMethodError) になります。 最後の2行を以下のように変えるとうまく動作します。 tmp=res.body tmp = up(tmp) puts tmp この理由が理解できません。 説明して頂けませんか?
- ベストアンサー
- その他(プログラミング・開発)
- Ruby の 文法に困ってます。
以下のようなソースの場合、to_sメソッドは何時呼ばれているのでしょうか。またどういう意味を成しているのでしょうか。 Ruby初心者のためご教授頂けないでしょうか。 よろしくお願いします。 class Vector attr_accessor :x, :y def initialize(x=0, y=0) @x = x @y = y end def length Math::sqrt(@x ** 2 + @y ** 2) end def to_s "(#{@x},#{@y})" end def <=> other length <=> other.length end end arr =[] arr << Vector.new(2,2) arr << Vector.new(3,2) arr << Vector.new arr.sort.each do |item| puts item end 結果は以下になります。 (0,0) (2,2) (3,2)
- ベストアンサー
- Ruby
- 後処理を保証するブロック付きメソッドの例について。
後処理を保証するブロック付きメソッドの例について。 後処理を保証するブロック付きメソッドの例として、以下のプログラムがありました。 def omit_brock1 if defined? yield puts "brock exist" else 以下略 2行目のyieldについて質問です。 yieldってはじめからRubyにあったはずです。これをdefined?してもかならずtrueが返るのではないでしょうか?とするとif文使うのも無駄だと思うのですが、どうなんでしょう? よろしくお願いします。
- ベストアンサー
- Ruby
- ブロック1 Ruby認定試験対策問題
Ruby認定試験対策問題をやっていたら分からないところがあったので、 教えてください。 2.9-1.ブロック ■問題 testメソッドに渡されたブロックのselfは次のうちどれか? class Foo def test (1..3).each{|i| yield(i)} end end foo = Foo.new foo.test{|i| i } ■回答 トップレベル ■解説 ブロックはメソッドの呼出し先のselfを継承します ■疑問 ・testメソッドに渡されたブロックとは、(1..3)のことを指すのでしょうか。 ・メソッドの呼出し先とは、foo.test{|i| i }のことを意味しているのでしょうか。 ・呼出し先のselfとは、fooかFooのことでしょうか? ・「selfはメソッド内で実行されるとそのメソッドを実行しているオブジェクトを参照することが出来ます」 と別のサイトに記載されていたのですが、「トップレベルのselfとはObjectクラスのメソッドを実行している」、という意味になるのでしょうか。 それがこの問題のどこに関連しているのでしょうか。
- ベストアンサー
- Ruby
お礼
toby_jpさん、ご回答有難うございました。 Proc.newとlambdaの挙動の違い、頂いた参考ページなどで 確認しておきます。 ご丁寧にありがとうございました。