我正在编写一个控制台应用程序,我想显示一个带有命令编号的提示符(即每次用户按下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
并生成提示。我认为如上所述更改线路是行不通的。
有人可以解释我做错了吗?
答案 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
,它应该可以正常工作。