我正在尝试根据用户提供的输入在 ruby 中构造一个散列。但是当我用“\n”输入字符串时,它会自动替换为双斜杠,然后是散列中的 n(\\n)。但是我希望数据与哈希中的数据相同。下面是我的代码。
puts "Enter the value"
value = gets.chomp
data = { "test" => "data", "value" => value }
puts data
这与哈希无关。您根本无法输入\n
控制字符(至少不使用gets
)。
如果作为用户输入\n
,则您输入了文字反斜杠,后跟文字n
。这表示为"\\n"
字符串。
我现在能想到的唯一可以直接输入的控制字符是制表符\t
(您可以通过输入实际的制表符来获得它,而不是\t
:
irb(main):001:0> gets.chomp
\n
=> "\\n"
irb(main):002:0> gets.chomp
a b
=> "a\tb"
irb(main):003:0> gets.chomp
=> ""
Enter您可以通过点击空白行并保持其余行保持不变来让用户结束输入:
puts "Enter the value, then hit ENTER on blank line to finish"
value = ''
until (line = gets).chomp.empty?
value << line
end
value.chomp!
data = { "test" => "data", "value" => value }
puts data
这个,进入后foo
Enterbar
EnterEnter会产生:
Enter the value, then hit ENTER on blank line to finish
foo
bar
{"test"=>"data", "value"=>"foo\nbar"}
唯一的限制是值的末尾不能有换行符。
另一种可能性是在从输入中读取字符串后“取消转义”字符串eval
。由于eval
可能不安全,我宁愿去yaml
图书馆,正如对相关问题的回答中所建议的那样:
require 'yaml'
puts "Enter the value"
line = gets.chomp
value = YAML.load(%Q(---\n"#{line}"\n))
data = { "test" => "data", "value" => value }
puts data
这个,进入后foo\nbar
Enter会产生:
Enter the value
foo\nbar
{"test"=>"data", "value"=>"foo\nbar"}
优点是它可以处理任意位置的换行符。