• ベストアンサー

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 この理由が理解できません。 説明して頂けませんか?

質問者が選んだベストアンサー

  • ベストアンサー
  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.1

res.body というのは、resというインスタンスの body というフィールドの値を取り出すものですが、 それは代入可能な存在ではないということです。 なぜかといわれてもそういう風になっているからとしか言えません(笑) 一方 tmp はふつーの変数なので、そんなごしゃごしゃはなくて = の左に置けば代入可能になります。

kingfruits
質問者

お礼

sakusaker7いつもご回答ありがとうございます。 スッキリしました。

その他の回答 (1)

  • x415f484f
  • ベストアンサー率71% (57/80)
回答No.2

# ANo.1 で回答されておられる方の仰っている通りなので、蛇足に過ぎませんが…… > class Hoge > def body > "aaa" > end > end これでは変数に代入できるような定義されておりません。 所望のクラスを定義するには class Hoge def initialize @body = "aaa" end def body @body end def body=(value) @body = value end end とすべきではないでしょうか?

kingfruits
質問者

お礼

ご回答ありがとうございます。 クラスの作り方によって動作が異なる。つまり提供ライブラリにより動作が異なるのですね。 res.body = Zlib::GzipReader.wrap(StringIO.new(res.body)) {|gz| gz.read } というコードを検索エンジンで拾い、res=Net::HTTP::Get.new("hoge") した後に使ったのが経緯です。

関連するQ&A

  • rubyで変数から指定したバイト読むには?

    たとえば、 Class Hoge initialize(arg)  @data=arg end def read(size)  @dataからsize分読んで返す。 end end みたいなクラスを hoge=Hoge.new(aaa) puts hoge.read(1024) puts hoge.read(1024) みたいに使いたいです。 指定したバイト分読むってどうするんですか? ご教授の程、宜しくお願いいたします。

    • ベストアンサー
    • Ruby
  • 【ruby】 『クラスの生成に失敗』を表現したい

    『クラスの生成に失敗』を表現したいのです。 newの戻り値にnilやfalseを返せばよいと考え、 以下の様に書いてみました。(行頭は全角スペースです。) class Hoge  def initialize(arg)   return arg  end end h = Hoge.new(false) STDERR.puts 'err' unless(h) errはputsされませんでした。(グーグルで調べるとinitializeのreturnは、返ってこないそうでした。) そこで以下の様に書きました。(行頭は全角スペースです。) class Hoge  attr_reader :stat  def initialize(arg)   @stat = arg  end end h = Hoge.new(false) STDERR.puts 'err' unless(h.stat) なんか、ものすごく我流になってる気がします。。。 アドバイスをお願いいたします。

    • ベストアンサー
    • Ruby
  • Rubyのsuperclassメソッドについて

    Rubyについての質問です。処理系は1.8.7です。 class Foo def initialize(a) @a = a end end のようなクラスを作成し、そのインスタンスを foo = Foo.new(1) のように作成します。 このとき、 foo.superclassを呼び出すと NoMethodError: undefined method `ancestors' for #<Foo:0x2b691220cc88 @a=1> とエラーになります。 一方で class FooExt < Foo def initialize (a,b) @b = b super a end end のようにFooを継承したクラスを作り、 fooext = FooExt.new(1,2) fooext.superclass とすると => Foo とsuperclassメソッドが動作します。 このsuperclassメソッドはどこで追加されたものなのでしょうか?

  • RubyのDateクラスのメソッドが見つからない

    先日よりRubyでのプログラミングを始めてみたのですが DateクラスのDate::MOTHNAMESを参照しようとしたところ undefined method `MOTHNAMES' for Date:Class (NoMethodError) と返ってきてしまいました。 ほかにもDate::exist?メソッドもためしてみましたが、同じ様なコメントが 返ってきました。 undefined method `exist?' for Date:Class (NoMethodError) なお、 Date.newなどはつかえています どういった問題でどのように解決すれば良いのか、ご教示願えればと思います。 バージョンは ruby 1.9.3p0 (2011-10-30 revision 33570) [x86_64-darwin11.2.0] で、Mac OSX Lionで動かしています。

  • ruby メソッドのリターン

    def hoge(arg) "" arg if arg != "" end p hoge("") 上記実行の結果はnilが出力されました。 def piyo(arg) "" end p piyo("") しかし、上記実行の結果は""が出力されました。 前者は""を返してくれないのが納得できません。 説明して頂けませんか?

  • Ruby インスタンス変数@fooを持つClass Fooの中ので関数fooを呼ぶ

    #!/usr/bin/ruby def foo(arg) arg.upcase end def bar(arg) arg.upcase end class Foo attr_reader :foo def initialize(arg) @foo = foo(arg) #@foo = bar(arg)とすれば期待した結果が得られる end end f=Foo.new("hoge") puts f.foo 上記実行するとエラーになります。 Class Fooの中のでfooといえば、インスタンス変数@fooであって、関数のfooではないって事なのでしょうか。 インスタンス変数@fooを持つClass Fooの中ので関数fooを呼ぶことはできないのでしょうか?

  • httpメソッドが使えない

    下記の内容のruby を実行したのですが、エラーが出てしまいます。 ---- require 'net/http' req = Net::HTTP::Get.new('/') Net::http.start('twitter.com') do |http| res = http.request(req) print res.body end ---- エラーメッセージ undefined method `http' for Net:Module (NoMethodError) ruby はver 1.8.7, 環境はMacOSX10.6.8です。 原因をご存知の方がいらっしゃいましたら、教えていただけないでしょうか? よろしくお願い致します。

    • ベストアンサー
    • 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】【文法】スパークラスのスーパークラスのメソッドを呼び出したい

    スパークラスのスーパークラスのメソッドを呼び出したいです。 たとえば、Hoge3のスーパークラスがHoge2で、さらにそのスーパークラス がHogeの時、Hoge3からHogeのメソッドを呼び出したいのです。 もう少し具体的に説明させてもらいます。 class Hoge  def initialize()   @name='hoge'  end end class Hoge2 < Hoge  def initialize()   super   @name='hogehoge'  end end class Hoge3 < Hoge2  def initialize()   super #これではスーパークラスHoge2のメソッドが呼ばれてしまう。   puts @name  end Hoge3.new() 上記実行結果は、hogehogeが出力ですが、 スーパークラスのスーパークラスが設定した@name値、 'hoge'が出力されるようにしたいです。 『Hoge3クラスはHoge2クラスを継承すればよいではないか?』 とも思うでしょうが、Hoge2クラスには、Hogeには無い機能が多く拡張されてると考えてください。 ご指導のほど、宜しくお願いいたします。

  • Ruby

    class CDPlayer def playDisk(disk) puts "playing a "+disk+".\n"; end end class CDRadioCaset < CDPlayer def playRadio(channel) puts "playing a"+channel+"\n"; end def playCaset(tape) puts "playing a "+tape+"\n"; end end class DVDRPlayer < CDPlayer def playDisk(disk) puts "playing a"+disk+"\n" end def recoredDisk(disk) puts "recording to a "+ disk+". \n" end end cd=CDPlayer.new puts "CDPlayer. \n" cd.playDisk("CD") radio=CDRadioCaset.new puts "\n CDRadioCaset. \n" radio.playRadio("Radio") radio.playCaset("Caset") dvd=DVDRPlayer.new puts "\n DVDRPlayer.\n" dvd.playDisk(" CD or DVD") dvd.recoredDisk("disk") の意味わかる方、教えてください