質問 |
||
| 質問者: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いつもご回答ありがとうございます。 スッキリしました。 |