• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:オリジナルプログラムです。)

Ruby言語を独学で勉強しながら、西暦から平成への変換プログラムを改良する方法について

このQ&Aのポイント
  • 「楽しいRuby第四版」を使いながら独学でRuby言語を勉強している方が、西暦から平成への変換プログラムを改良する方法について質問しています。
  • プログラムの改良の際に、引数の受け取り方に関するエラーが発生し、解決方法を知りたいとしています。
  • 具体的には、ad = ARGV[0].to_i の箇所を ad = ARGV[0]; ad.to_i と分けて記述した場合にエラーが出る理由を理解したいとのことです。

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

  • ベストアンサー
  • hitomura
  • ベストアンサー率48% (325/664)
回答No.1

to_i は数値オブジェクトに変換したものを返すメソッドです。そのオブジェクト自身を変更することはありません。 > ad = ARGV[0].to_i では ARGV[0] の値そのものではなく ARGV[0] を数値オブジェクトにした値が ad に入ります。 一方、 > 03:ad = ARGV[0] > 04:ad.to_i では ad に ARGV[0] の値が入り、続けてその値を数値オブジェクトに変換したものを生成しています。しかし、せっかく変換した値をどこにも代入していないため、その値は破棄されます。 上記の形を生かすならば、04 行を ad = ad.to_i としましょう。 なお、 > irbで同じことをやってみると、2行目のad.to_iで数値オブジェクトに変換される とのことですが、変換された結果をただ表示しただけで上記の通り変換した値を保持していないので > 再びadの変数内を参照すると文字列としてオブジェクトが格納されていました ということになります。

noname#208914
質問者

お礼

分かり易い回答をありがとうございました。 なるほど、そのオブジェクト自身を変更するものではなく、変換したものを生成して返すだけの機能でしたか。 それを変数に代入するなり式に組み込むなりしないと意味がないと。 誤解が晴れてすっきりしました。

関連するQ&A