带有实例变量的字符串格式的意外输出

时间:2015-04-25 01:36:04

标签: ruby

我正在编写一个控制台应用程序,我想显示一个带有命令编号的提示符(即每次用户按下Enter键时增加的变量)。

预期产出:

[0] app_name >
1
[1] app_name >
2
[2] app_name >

以下是代码:

class Prompt
  attr_accessor :format, :string, :prompt, :index
  def initialize
    init_vars
    @format = "[%s] %s > "
    @string = [@index, "app_name"]
    @prompt = @format % @string
  end
  def init_vars
    @index = 0
  end
  def update_prompt
    @index += 1
    @prompt = @format % @string
  end
end

require 'readline'

prompt = Prompt.new
while last = Readline.readline(prompt.prompt)
  prompt.update_prompt
  puts prompt.index
end

输出:

[0] app_name >
1
[0] app_name >
2
[0] app_name >

当我改变这一行时:

@prompt = @format % @string

为:

@prompt = @format % [@index, "app_name"]

我计划将其用于内部框架,并希望用户指定@format@string并生成提示。我认为如上所述更改线路是行不通的。

有人可以解释我做错了吗?

2 个答案:

答案 0 :(得分:1)

以下是工作代码:

class Prompt

  attr_accessor :format, :string, :prompt, :index

  def initialize
    @index = -1
    @format = "[%d] %s > "
    update_prompt
  end

  def update_prompt
    @index += 1
    @string = @index, "app_name"
    @prompt = @format % @string
  end

end

require 'readline'

prompt = Prompt.new
while last = Readline.readline(prompt.prompt)
  prompt.update_prompt
  #de puts prompt.index
end

输出符合预期:

[0] app_name > 
[1] app_name > 
[2] app_name > 
[3] app_name > 
[4] app_name > 
[5] app_name > 
[6] app_name > 

@string@index == 0冻结,因此需要更新,例如@index。我也认为@index会更新,并且只有一个引用存储在@string中,但是值已存储...而不是可以更新的引用。我很好奇为什么,但我已经修好了代码。

了解我们对如何处理@string的了解...

这是一个更小的版本:

class Prompt

  attr_accessor :format, :string, :prompt, :index

  def initialize
    @index = -1
    @format = "[%d] %s > "
    update_prompt
  end

  def update_prompt
    @prompt = @format % [ @index += 1, "app_name" ]
  end

end

答案 1 :(得分:0)

好的,问题是@index已更新,但@string未更新。因此,如果我在@string = [@index, "app_name"]方法中的索引增量之后立即添加update_prompt,它应该可以正常工作。