ようこそ ゲスト さん、新規登録(無料)して気になる疑問を解決しませんか?

質問

質問者:kingfruits 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

この理由が理解できません。
説明して頂けませんか?
質問投稿日時:08/03/26 00:39
質問番号:3895075
この質問に対する回答は締め切られました。
最新から表示回答順に表示良回答のみ表示

回答

良回答10pt

回答者:x415f484f # 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

とすべきではないでしょうか?
種類:アドバイス
どんな人:一般人
自信:参考意見
回答日時:08/03/26 03:51
回答番号:No.2
この回答へのお礼ご回答ありがとうございます。

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

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

回答

良回答20pt

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

一方 tmp はふつーの変数なので、そんなごしゃごしゃはなくて
= の左に置けば代入可能になります。
種類:回答
どんな人:経験者
自信:参考意見
回答日時:08/03/26 02:47
回答番号:No.1
この回答へのお礼sakusaker7いつもご回答ありがとうございます。

スッキリしました。
 
最新から表示回答順に表示良回答のみ表示