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

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

オリジナルプログラムです。

楽しいRuby第四版を見ながら、独学でRuby言語を勉強している者です。 p.71に記載されているList 5.1の、西暦から平成へ変換するプログラムad2heisei.rbについてなんですが、1988年以前の西暦を入力すると平成0年になったり、マイナスになったりするという問題点をその章の課題である条件判断文を使いながら、西暦を平成から昭和まで変換できる改良版をつくってみました。 01:#西暦から平成および昭和に変換する 02: 03:ad = ARGV[0].to_i 04:if ad > 1988 05:  heisei = ad - 1988 06:  print "西暦", ad, "年は平成", heisei, "年です。\n" 07:elsif 1988 > ad && ad > 1925 08:  syouwa = 63 - (1988 - ad) 09:  print "西暦", ad, "年は昭和", syouwa, "年です。\n" 10:else 11:  print "西暦", ad, "年は昭和以前です。\n" 12:end で、質問なんですが、当初3行目のad = ARGV[0].to_iを分かり易いように二段に分けて 03:ad = ARGV[0] 04:ad.to_i という風にしていたらエラーが出て走りませんでした。 ARGVはコマンドラインに入力されたものを文字列オブジェクトとして受け取ることは分かっていたのですが、何故上の記述でエラーがでるのか理解できませんでした。 irbで同じことをやってみると、2行目のad.to_iで数値オブジェクトに変換されるのですが、再びadの変数内を参照すると文字列としてオブジェクトが格納されていました。 変数に代入する再に数値に変換しておかないと、後からではいくら数値に変換してもその場かぎりで、その値が失われてしまうということなのでしょうか? 詳しい方いらっしゃいましたらご教授願います。

noname#208914
noname#208914
  • Ruby
  • 回答数1
  • ありがとう数10

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

  • ベストアンサー
  • 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

  • 昭和→西暦に・・・

    昭和、平成などで表された年号を簡単に西暦に変換する方法ってありますか??昭和33年→1958年というように。

  • rubyのプログラムについて

    rubyのプログラムで2~1000までの素数を列挙のものなんですがどこか違ってますか汗 考えたんですがよくわからなくて汗すみませんどなたかお願いします i=2 print "素数は\n" while i<=1000 do warukazu=2 flag=0 while warukazu<i do if i%warukazu==0 then flag=flag+1 warukazu=warukazu+1 else warukazu=warukazu+1 end end if (flag==0) then print i print"\n" end i=i+1 end

  • 西暦と元号の組合せ

    平成16年・・・西暦2004年 平成15年・・・西暦2003年 平成14年・・・西暦2002年 平成13年・・・西暦2001年 平成12年・・・西暦2000年 ・・・・・・・・・・・・ ・・・・・・・・・・・・ 平成元年・・・西暦1989年 昭和64年・・・西暦1989年 昭和63年・・・西暦1988年 ・・・・・・・・・・・・ ・・・・・・・・・・・・ 上記のように一覧になったサイトはネット上でいくつかありますが、元号が年の途中で変わった時に(○○月○○日までは昭和64年、○○月○○日以降は平成1年というふうに)元号が変わった日付も分かるサイトがなかなか見つかりません。 なるべく古い年まで分かるとありがたいのですが知ってる方教えていただけないでしょうか。

  • Excel IFの重複 #value!エラーが出る

    こんにちわ。 ExcelでIF関数を重複させ(IFの中にIF)、和暦(昭和等)を西暦に変更する関数を作っています。 和暦は昭和、平成のみで、昭和50年ならば昭50のように打ち込み、 =IF(FIND("昭",A1),SUBSTITUTE(A1,"昭",)+1925,IF(FIND("平",A1),SUBSTITUTE(A1,"平",)+1989,)) このように昭和、平成を判断して西暦に変換しようとしています。 が、この関数では昭和の変換はできますが、平成の変換(平23→2011等)を試すと #value!エラーとなってしまいます。 調べたのですがエラーの原因がわかりません。 どなたかご教示ください。 よろしくお願いします。

  • 計算方法を教えてくださいませ。

    こんにちわ! 計算が苦手な60代の者です。 西暦を平成何年にするには? 又 平成何年を西暦で何年にするには? 例: 2012年 昭和何年? 平成24年 又 平成24年 昭和?は 西暦2012年。 一番簡単な計算方法を教えて頂きたいのですが、よろしくお願い申し上げます。

  • 西暦何年、を昭和や平成何年、におきかえる計算方法を教えてください!

    西暦の年を昭和、平成何年に置き換える計算方法、逆に平成や昭和を西暦に置き換える計算方法を教えてください!

  • javascriptの外部呼出しについて

    javascriptの外部呼出しについて まず、外部ファイルである、ao.jsの中に var heisei; var fullYear; var message; heisei = 20; fullYear = heisei + 1988; message = "平成" + heisei + "年は" + "西暦" + fullYear + "年です"; document.write("<p>", message, "<p>"); ↑↑これを○○.htmlの中の<body>の中に呼び出して、入れたいんですけど、どうやればいいのでしょうか? 本やネットで見ても、外部呼出しについては詳しくは書かれていません。 簡単に呼び出せるとしても、その方法がわかりませんので、教えてくれるとありがたいです。

  • 西暦から和暦に変換する関数を作る

    西暦から和暦に変換する関数をVBAで作りたい(昭和と平成だけ)のですが 良くわかりません。どなたか教えて頂けませんか?

  • 西暦→和暦

    avaで、西暦→和暦に変換するプログラムを組みたいのですが、 例えば、 2008/11/22 と入力したら、 平成20年11月22日 と表示されるようなプログラムを作りたいのですが、 (昭和と平成のみ対応) 教えて下さい…m(__)m

  • Rubyプログラムの引数($1)渡しに関して

    お世話になります。前任者の作成したプログラムを読んでいるのですが、以下の部分が分からない為、ご教示頂ける方がいらっしゃれば、ご協力よろしくお願いいたします。 <エラーメッセージ表示部> def usage STDERR.print "\nusage: #$0 [-F/D] [-START/STOP] Filename \n" exit 1 end <オプション処理部> while ARGV[0] =~ /^-/ case ARGV.shift when /^-F(\d+)/ ; calling_num = $1.to_s when /^-T(\d+)/ ; called_num = $1.to_s when /^-START/ ; start_only = true when /^-STOP/ ; stop_only =true else ; usage end end 上記の $1へ値を渡すためには、コマンド入力時に特別な引数を渡す方法が必要なのでしょうか。 $ ruby -v check.rb -STOP Filename ⇒ 正常終了 $ ruby -v check.rb -F 012345678 Filename ⇒ STDERR.print 表示

    • ベストアンサー
    • Ruby

専門家に質問してみよう