こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

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

この理由が理解できません。
説明して頂けませんか?

投稿日時 - 2008-03-26 00:39:01

QNo.3895075

困ってます

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

res.body というのは、resというインスタンスの body というフィールドの値を取り出すものですが、
それは代入可能な存在ではないということです。
なぜかといわれてもそういう風になっているからとしか言えません(笑)

一方 tmp はふつーの変数なので、そんなごしゃごしゃはなくて
= の左に置けば代入可能になります。

投稿日時 - 2008-03-26 02:47:52

お礼

sakusaker7いつもご回答ありがとうございます。

スッキリしました。

投稿日時 - 2008-03-26 13:28:57

このQ&Aは役に立ちましたか?

1人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.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

とすべきではないでしょうか?

投稿日時 - 2008-03-26 03:51:14

お礼

ご回答ありがとうございます。

クラスの作り方によって動作が異なる。つまり提供ライブラリにより動作が異なるのですね。

res.body = Zlib::GzipReader.wrap(StringIO.new(res.body)) {|gz| gz.read }
というコードを検索エンジンで拾い、res=Net::HTTP::Get.new("hoge")
した後に使ったのが経緯です。

投稿日時 - 2008-03-26 13:59:45