0

Ruby では、インスタンス変数の値をユーザーに表示し、その値が何を使用する必要があるかを尋ねますgets.chomp。いくつかの変数に対してこれを行うため、メソッドで値を確認したいと思います。私の問題はgets、メソッドを呼び出すと、ユーザーの入力を求めずにプログラムが実行されることです。

コードの関連部分は次のとおりです。

class TagPodcast

  # ... Code to pull ID3v2 tags from MP3 file

  def inspect_tags
    puts "Title: " + @title
    set_tag(self.title)
  end

  def set_tag(tag)
    new_value = gets.chomp
    tag = new_value unless new_value == ""
  end

end

TagPodcast.new("myfile.mp3").inspect_tags

プログラムを実行すると、出力さTitle: My Title Hereれますが、入力を求めることなく終了します。に電話するにはどうすればよいgetsですか?

4

2 に答える 2

2

この(わずかに変更された)プログラムは、期待どおりに入力を求めます(アクセサーとコンストラクターを追加しただけです):

class TagPodcast
  attr_accessor :title

  def initialize(filename)
    @filename = filename
  end

  def inspect_tags
    puts "Title: " + @title
    set_tag(self.title)
  end

  def set_tag(tag)
    new_value = gets.chomp
    tag = new_value unless new_value == ""
  end
end

tp = TagPodcast.new("myfile.mp3")
tp.title = 'Dummy Title'

tp.inspect_tags

ただし、コードには別の問題があります。変数は参照ではなく値によってメソッドに渡されるため、このコードは期待どおりに動作しません。

class Foo
  attr_accessor :variable

  def set_var(var)
    var = 'new value'
  end

  def bar
    self.variable = 'old value'
    set_var(self.variable)

    puts "@variable is now #{self.variable}"
  end
end

Foo.new.bar

これは印刷されます@variable is now old value。これには2つの方法が考えられます。次のように、メソッドの外側でインスタンス変数を設定します。

class Foo
  attr_accessor :variable

  def do_stuff
    'new value'
  end

  def bar
    self.variable = 'old value'
    self.variable = do_stuff

    puts "@variable is now #{self.variable}"
  end
end

Foo.new.bar

または、Ruby の強力なメタプログラミング機能を使用instance_variable_setして、名前をシンボルとして渡すことでインスタンス変数を動的に設定します。

class Foo
  attr_accessor :variable

  def set_var(var)
    instance_variable_set var, 'new value'
  end

  def bar
    self.variable = 'old value'
    set_var(:@variable)

    puts "@variable is now #{self.variable}"
  end
end

Foo.new.bar

元の質問に関しては、実行コンテキストについてもっと知る必要があります。おそらく STDIN は、実行時に期待するものではありません。

于 2013-04-03T17:37:53.847 に答える
0

次を使用して、標準入力から入力を取得していることを確認します。

STDIN.gets.chomp

また

$stdin.gets.chomp
于 2013-04-03T18:04:43.067 に答える