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。我可以想到两种解决方法。或者在方法之外设置实例变量,如下所示:

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 回答