• ベストアンサー

Rubyの引数が理解できません。(初心者です)

プログラミング言語を覚えたいと考え、諸々の事情からRubyを独学したいとおもっております。 先日、「14歳からはじめるRuby…」という本を購入し、早速勉強を始めたのですが、引数でいきなり躓いてしまいました。 以下のような例文がありましたが、原理(理屈?)が理解できません。ご教唆お願いします。 001 def syomei s 002  puts "" 003  puts "============" 004  puts "" + s 005  puts "============" 006 end 007 puts "What's your name?" 008 name = gets.chomp 009 puts "Hello," + name + "!" 010 syomei name なぜ、これでメソッドの中へ変数が引き渡されるのかが理解できません。 「008 name」で初めて出てくるnameと引数"s"が何故イコールになるのでしょうか? 例えば(全くのデタラメですが)、「010 syomei name.s」であったり「010 syomei name = s」などのように定義付けされているのであれば、納得できるのですが…。 初歩中の初歩なのはわかっているのですが、理屈を理解したいと思ってます。よろしくお願いします。

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

  • ベストアンサー
  • lv4u
  • ベストアンサー率27% (1862/6715)
回答No.2

>>001 def syomei s 上記のコードは、 001 def syomei(s) と同様な意味となります。rubyでは、自明な位置の()は省略できます。 そして、010 syomei name のコードで、最初に定義したメソッド syomei が呼ばれて、パラメータのnameがsyomeiの引数 s に渡されます。ここでのsは、仮の変数みたいなもので、呼ばれるときには、呼び出したnameの内容になります。 新たに言語を覚えるときには、入門演習用の1冊だけの本では不十分ですね。さしあたって、「たのしいRuby」「Rubyレシピブック268の技」などもとりあえず購入しましょう。ネットで調べるという手もありますが、ネットと違って、電車の中とか、トイレでパラパラと気楽に読めるのが書籍のいいところですね。 21世紀のBasic言語ともいわれるRubyは、手軽に高度な処理が実現できる言語で、使っていて楽しくなりますね。Java等は「先行き?でやる気無し」でしたが、Rubyは将来性十分に感じて、勉強中です。 おたがい初心者。がんばりましょう。

fat_tower
質問者

お礼

回答ありがとうございます。 返信が遅くなりすみません。 ご丁寧な回答、大変参考になります。 001 def syomei s の"s"は、 もしかして 「後で出てくるsyomeiの後ろにくっつくnameなどの変数をメソッドに引き渡してくれよ」という意味でしょうか? なるほど、何となく理解できました。 ご紹介頂いた参考書も購入したいと思います。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (2)

  • buriburi3
  • ベストアンサー率44% (353/792)
回答No.3

Rubyの知識は全くありませんが、全く知らなくてもこれくらいは読めます。 001 def syomei s から 006 end までが syomeiメソッド (? クラスなのか? 単なるファンクションじゃね?)の《定義》で 動作は 007 以降から始まります。 008 で name に文字列を入力して 010 で 001~006で定義しているsyomeiの引数sにnameの値を渡して実行 記述順序では「004  puts "" + s」が「008 name = gets.chomp」より前に書いあるけど実行順序では「008 name = gets.chomp」の方が「004  puts "" + s」より先に実行される。

fat_tower
質問者

お礼

回答ありがとうございます。 返信が遅くなりすみません。 回答者様が考えられているよりも、恐らく、はるかに初心者ですので、さらに勉強を重ねたいとおもいます。

全文を見る
すると、全ての回答が全文表示されます。
  • koko_u_
  • ベストアンサー率18% (459/2509)
回答No.1

>「008 name」で初めて出てくるnameと引数"s"が何故イコールになるのでしょうか? 根本的に勘違いされておられるようですが、= はただの「代入」です。 gets は標準で用意されている「関数」で、標準入力(普通はコンソール)から一行読んで、読み込んだ文字列を返します。 name = gets.chomp の意味は「コンソールから一行読み込んで(gets)、結果の改行コードを除去(chomp)して、結果を変数 name に格納する」 というだけです。

fat_tower
質問者

お礼

回答ありがとうございます。 返信が遅くなりすみません。 私の質問の仕方が悪かったようです。 >name = gets.chomp の意味は「コンソールから一行読み込んで(gets)、結果の改行コードを除去(chomp)して、結果を変数 name に格納する」 の部分は理解できているはず何ですが、なぜnameに格納された入力文字が、メソッドへ引き渡されるのかが、わかっていませんでした。 「引数って何?」という初歩中の初歩なので、根気よく勉強したいと思います。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • Ruby初心者です。

    以下の練習問題をやっているのですが、どうもうまくいきません。 (1)担当名が"end"になる迄、担当名と売上を入力する。 (2)売上合計を求める。 (3)各担当の売上が売上合計の何%になるかの比率の計算を行う。 (4)担当名、売上、比率を表示する。 どこがいけないのがご教授頂けますでしょうか。 よろしくお願い致します。 *********************************** #! ruby -E Windows-31J:utf-8 # coding: utf-8 kensu = 0 uriage = 0 goukei = 0 uriage_t = [20] tanto = [10] tanto = [20][10] puts("担当名がendで終了") print(kensu = kensu + 1, "人目の担当名は") tanto = $stdin.gets.chomp! tanto.gsub!("\n", "") print("売上") uriage = $stdin.gets.chomp!.to_i while tanto != "end" kensu = kensu goukei = goukei + uriage uriage_t = uriage tanto_t = tanto print(kensu = kensu + 1, "人目の担当名は") tanto = $stdin.gets.chomp! tanto.gsub!("\n", "") if tanto != "end" print("売上") uriage = $stdin.gets.chomp!.to_i end end kensu = kensu + 1 goukei = goukei + uriage uriage_t = uriage tanto_t = tanto, "合計" puts "________________________________________" puts "  担当      売上  比率  " puts "________________________________________" for i in kensu kensu += i ritu = uriage * 100 / goukei puts "担当名は#{tanto} 売上は#{uriage_t}円 比率は#{ritu}%" end

  • Rubyの初心者ですが壁にぶちあたっております

    『初めてのプログラミング』を読んでRubyを勉強しています。その中にある問題でp.127の『ローマ数字をアラビア数字に変換するプログラム』を書け、というのがありまして、最初に入力したローマ数字を弾く部分を書いているのですが…(以下コード) puts 'Enter roman numeral.' roman = gets.chomp.upcase roman_array = roman.to_a def char_checker(char) parts = ['I', 'V', 'X', 'L', 'C', 'D', 'M'] parts.each do |part| if part != char char = false elsif part == char char = true return char end end puts char_checker('X') (以上コード) このchar_checker, なぜかpartsを返してきます。返してほしいのはcharのtrueかfalseなのに泣 書いたコードに間違いがあるのはわかっているのですが、どこで間違っているのかがどうしてもわかりません。わかる方回答よろしくお願いします。ちなみに環境はMac OS X 10.5.4でrubyのバージョンはバンドルされている1.8.6です。

  • 検索対象を変数に与えてマッチング

    Rubyの初心者です。次のサンプルがマッチングできない、 書き方を教えてくださいませんか。 #!/usr/bin/env ruby key = "キーワード" while gets $_.chomp! puts $_ if $_ =~ /"#{key}"/ end puts 文を puts $_ if $_ =~ /キーワード/ に書き買えば、検索はできますが、変数に与えてマッチング することはできないでしょうか。 ご教示を宜しくお願いします。

    • ベストアンサー
    • Ruby
  • なぜRuby1.9が日本語処理できない問題

    次の簡単なRubyプログラム(test.rb)ですが、 #!/usr/bin/env ruby # -*- coding: utf-8 -*- while gets $_.chomp! tmp = $_.split(/ /) s0 = tmp[0] s1 = tmp[1] s2 = tmp[2] puts "line #{s0}\t#{s1}\t#{s2}" end 入力テキストファイル(hello.txt)は次の2行です。 1 hello, everybody! 2 皆さん、 こんにちは。 test.rb hello.txt を実行すると、Ruby 1.8.7 は問題なく正常ですが。Ruby 1.9.3は次のエラーになりました。 line 1 hello, everybody! k1.rb:7:in `split': invalid byte sequence in US-ASCII (ArgumentError) from k1.rb:7:in `<main>' 何故でしょうか。詳しい方に教えて頂けるでしょうか。 どうぞ宜しくお願いします。

    • ベストアンサー
    • Ruby
  • Ruby の 文法に困ってます。

    以下のようなソースの場合、to_sメソッドは何時呼ばれているのでしょうか。またどういう意味を成しているのでしょうか。 Ruby初心者のためご教授頂けないでしょうか。 よろしくお願いします。 class Vector   attr_accessor :x, :y   def initialize(x=0, y=0)     @x = x     @y = y   end   def length     Math::sqrt(@x ** 2 + @y ** 2)   end   def to_s      "(#{@x},#{@y})"   end   def <=> other     length <=> other.length   end end arr =[] arr << Vector.new(2,2) arr << Vector.new(3,2) arr << Vector.new arr.sort.each do |item|   puts item end 結果は以下になります。 (0,0) (2,2) (3,2)

    • ベストアンサー
    • Ruby
  • rubyで標準入力とファイルからのgets

    ActiveScriptRuby v1.8.5でやっています。 実行時にコマンドラインでファイル名を与えてファイルの内容を取得した後、氷人出力からも入力をとろうとしています。しかしファイルの内容を読み出したあとのgetsがnilを返すだけで標準入力から入力をとれません。以下のようなコードでやっています。 ##stdin.rb while line = gets do print line break if line.chomp.empty? end puts' - ' print gets #ここで標準入力から文字をとりたい 実行時は ruby stdin.rb moji.txt という感じで読ませたいファイル名を渡しています。 マニュアルには 最後まで ARGF を読み込んだ後、再度 ARGF から内容を読むと (ARGV が空なので)標準入力からの読み込みとなります。 とありますが、どこがおかしいのかさっぱりわかりません。 アドバイスなどよろしくお願いします

  • 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
  • Rubyについて質問です

    Rubyについて質問です class Document #省略 def each_word word_array = words index = 0 while index < words.size yield(word_array[index]) index += 1 end end end d = Document.new('Truth', 'Gump', 'Life is like a box of...') d.each_word { |word| puts word } このような例題があるのですが、 このまま実行しても引数エラーがでてしまいます。 「省略」のところをどのように追加すれば実行できるようになりますか? 参考書:ELOQUENT RUBYの中の例題です ちなみに実行結果は以下の通りです Life is like a box of ... どうかよろしくお願いいたします

  • 消えたコロン

    消えたコロン 以下のプログラムを実行すると、「ruby」と出力されます。なぜ「:」が表示されないのか、納得できません。どなたか、理由を解説できる方はいらっしゃいませんでしょうか?なるべく簡単な言葉でお願いします。 def func(x) puts(x[:name]) end func(:date =>Time.now, :name => :ruby, :version => 1.9)

    • ベストアンサー
    • Ruby
  • Ruby 暗号化したファイルの復号について

    Rubyでファイルを暗号化し、それを復号したいのですがうまくいかないため、 質問させていただきます。 Ruby 1.9.3を使用しています。 ・ファイルの暗号化 encrypt.rb ------------------------------------------------- # encoding: cp932 require 'openssl' def encrypt(file, pass)   enc = OpenSSL::Cipher::AES256.new('CBC')   enc.encrypt   enc.pkcs5_keyivgen(pass)   File.open(file, 'rb') do |fin|     File.open("#{file}.sec", 'wb') do |fout|       while buff = fin.read(8000)         fout.write(enc.update(buff))       end       fout.write(enc.final)     end   end   enc.reset end if $*.length > 0   print 'password: '   pass = $stdin.gets.chomp   $*.each do |arg|     begin       encrypt(arg, pass)       puts "#{arg}を暗号化したファイル#{arg}.secを作りました。"     rescue       puts "#{arg}の暗号化に失敗しました。"     end   end   0.upto(pass.length - 1) do |i|     pass[i] = '\xff'   end end ------------------------------------------------- ・ファイルの復号 decrypt.rb ------------------------------------------------- # encoding: cp932 def decrypt(file, pass)   dec = OpenSSL::Cipher::AES256.new('CBC')   dec.decrypt   dec.pkcs5_keyivgen(pass)   File.open(file, 'rb') do |fin|     File.open("#{file}.plain", 'wb') do |fout|       while buff = fin.read(512)         fout.write(dec.update(buff))       end       fout.write(dec.final)     end   end   dec.reset end if $*.length > 0   print 'password: '   pass = $stdin.gets.chomp   $*.each do |arg|     begin       decrypt(arg, pass)       puts "#{arg}を復号したファイル#{arg}.plainを作りました。"     rescue       puts "#{arg}の復号に失敗しました。"     end   end   0.upto(pass.length - 1) do |i|     pass[i] = '\xff'   end end ------------------------------------------------- コマンドプロンプトでencrypt.rb自身を暗号化し、encrypt.rb.secの作成はできるのですが、 decrypt.rbを実行してパスワードを入力しても復号ができません。 どのようにすれば復号できるのか教えていただけますでしょうか。

    • ベストアンサー
    • Ruby