这个(稍微修改过的)程序按预期要求我输入(只是添加了访问器和构造函数):
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
。我可以想到两种解决方法。或者在方法之外设置实例变量,如下所示:
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 不是您在执行时所期望的。