この(わずかに変更された)プログラムは、期待どおりに入力を求めます(アクセサーとコンストラクターを追加しただけです):
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 は、実行時に期待するものではありません。