2016-10-09 1 views
0

みなさん、こんにちは、私は初心者にはルビー 私は私がしたいファイル名を取得することができますライン2からファイル違いgets.chomp

puts "what is your filename?" 
filename = $stdin.gets.chomp 

からデータを取得するために練習していますを学ぶことになっています しかし、私はgets.chompを書くだけでエラーになります 私はすでに標準入力を意味する$ stdinを知っていますが、まだこれを理解できません 誰かが私を助けることができますか? THX

+0

をああ、私がいることを見つけるストリームがtty、ソケット、ファイルなどをすることができることを

gets.chompも使える!!だから、$ stdinが今のところ@@ – shinyMao

答えて

0

ストリームを指定せずにgetsを呼び出すときに、私たちはKernel#getsを呼び出していると、ストリームが指定されているときに我々は、私はボンネットの下にIO#gets周りKernel#getsラップを信じているが、それはIOオブジェクトを作成する必要がある前IO#gets

を呼び出すこと、 IOオブジェクトはすべてのコマンドライン引数(ARGV)を連結します(1つのファイルを順番にファイルとしてオープンしようとします)。 ARGVに要素が残っていない場合は、stdinから読み込みます。

挙動は、この単純なスニペットを使用してテストすることができる:

while gets 
     puts $_ 
end 

パラメータなしruby myscript.rbを実行している、それが作品を意志、パラメータが指定されている場合、それはファイルとして開き、それから読み取るしようと、標準入力読み込みますcatコマンドと同様です。ソケット使用

stream = File.open('/etc/passwd','r') 

puts stream.gets 

stream.close 

シンプルなHTTPクライアント::!

require 'socket' 

s = TCPSocket.new 'icanhazip.com',80 

s.puts <<~EOF 
GET/HTTP/1.1 
Host: icanhazip.com 

EOF 

while line = s.gets 
     puts line 
end 

s.close 

More about Kernel#gets here

More about IO#gets

+2

のために働いていることに気づくことができません "もしストリームが' $ stdin'から読み込みが指定されていなければ、 " - ' 'Kernel#gets'(http:// ruby​​-doc .org/core/Kernel.html#method-i-gets)、そうではありません。引数を渡すと、最初に 'ARGV'の内容がファイル名として解釈され、そこから読み取られ、' ARGV'で指定されたすべてのファイルを読み込んだ後でのみ、標準入力から読み込まれます([ ARGF'](http://ruby-doc.org/core-2.4.0_preview2/ARGF.html)が動作します)。 (そして、私はそれが '$ stdin'から、' $ <'ではなく、' $ <'から読み込むのかどうかは分かりません) –

+0

@JörgWMittagあなたは正しいです、私は自分の答えを編集しています – Tiago

+0

_" gets is a methodストリームから1行を読み込みます。ストリームが指定されていなければ、それは... "_ - あなたは1つのように2つの異なるメソッドを記述しています。前者はインスタンスメソッド['IO#gets'](http://ruby-doc.org/core-2.3.1/IO.html#method-gets)であり、後者はグローバル関数[' Kernel #gets'](http://ruby-doc.org/core-2.3.1/Kernel.html#method-i-gets)を参照してください。 – Stefan