- ベストアンサー
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」などのように定義付けされているのであれば、納得できるのですが…。 初歩中の初歩なのはわかっているのですが、理屈を理解したいと思ってます。よろしくお願いします。
- みんなの回答 (3)
- 専門家の回答
関連する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の初心者ですが壁にぶちあたっております
『初めてのプログラミング』を読んで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 暗号化したファイルの復号について
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
お礼
回答ありがとうございます。 返信が遅くなりすみません。 ご丁寧な回答、大変参考になります。 001 def syomei s の"s"は、 もしかして 「後で出てくるsyomeiの後ろにくっつくnameなどの変数をメソッドに引き渡してくれよ」という意味でしょうか? なるほど、何となく理解できました。 ご紹介頂いた参考書も購入したいと思います。