Ruby 哈希不从get.chomp返回值
由于某种原因,当我试图从命令行获取参数时,我创建的散列不会返回值 这是密码Ruby 哈希不从get.chomp返回值,ruby,Ruby,由于某种原因,当我试图从命令行获取参数时,我创建的散列不会返回值 这是密码 DIAL_BOOK = { "East Bay": 510, "San Francisco": 415, "San Jose": 650, } city = gets.chomp if city == "East Bay" puts "Area Code: #{DIAL_BOOK[city]} end 输出结果 Which area code would you like
DIAL_BOOK = {
"East Bay": 510,
"San Francisco": 415,
"San Jose": 650,
}
city = gets.chomp
if city == "East Bay"
puts "Area Code: #{DIAL_BOOK[city]}
end
输出结果
Which area code would you like to find out
East Bay
Area Code:
我完全搞不懂这里发生了什么。当我将“East Bay”硬编码到散列时,它会返回510。有人对发生的事情有什么建议吗
:city
,而不是实际变量city
而不是$
完成的(例如{DIAL#u BOOK[city]}
)city
包含字符串。更改哈希以使用字符串作为键(DIAL_BOOK={'Easy Bay'=>510}
),或者在查找之前将城市转换为符号({DIAL_BOOK[city.to_sym]
)此外,您可能希望简化并删除
if
条件,除非您只想打印“East Bay”的值。变量city
不同于symbol:city
。要在ruby中插入字符串,请使用{expression}
在双引号内,因为双引号允许转义序列,而单引号不允许
city = gets.chomp
puts "Area Code: #{DIAL_BOOK[city]}" if city == "East Bay"
对于作为散列中键的字符串,请使用rocket=>
而不是:
。否则您将不得不使用city.to_sym
而不是city
DIAL_BOOK = {
"East Bay" => 510,
"San Francisco" => 415,
"San Jose" => 650,
}
rocket运算符可以接受任何无效标签的文字。A:
假定其左侧有有效标签。拨号簿[:'East Bay']#=>510
{ :$set => 11 } # Valid
{ $set: 11 } # Invalid
{ :'where.is.pancakes.house?' => 23 } # Valid
{ 'where.is.pancakes.house?': 23 } # Invalid
放入“区号:{拨号簿[city.to_sym]}”
Wow这很有效,出于某种原因,当我在散列中使用火箭时,我可以显示区号,但当它返回到冒号中时,我必须将其添加到sym中。有人知道它为什么会这样做吗?我切换到仅使用city,但它给了我同样的问题。我将冒号切换为=>并且出于某种原因,显示了值aying。我不确定到底发生了什么。对。通过使用{'foo':'bar'}
原样定义哈希,键被转换为符号。因此{'foo':'bar'}{:foo=>bar}
如果你想让键保持为字符串,你需要使用hashrocket,{'foo'=>bar'}
。或者,您可以将城市转换为符号(city.to_sym
)我将更新我的答案以包含这一点。当我使用to_sym
时是否有任何问题?因此,我希望它们保持为字符串,这意味着我自动必须使用to_sym
。正确吗?这两个选项都是可行的。请理解,当前哈希值不使用字符串键,而是符号键。虽然“foo”
声明一个字符串,:“foo”
声明一个符号,:foo
。类似地,{'foo':'bar'}
声明一个包含键的哈希值:foo
(作为符号)。如果确实需要字符串键,则必须使用hashrocket语法{'foo'=>'bar'}
。就个人而言,在这种情况下,我只会使用hashrocket语法,因为我认为带有空格和大写字母的符号有点奇怪-为了声明一个,通常必须使用:“Foo Bar”或“Foo Bar”。对于sym
@Shinne来说,这不是风格好坏的问题。hash允许任何对象类型作为其属性ys.使用适合您需要的任何东西。(字符串整数对似乎是一个合理的选择)我之前有一些输入错误,但to_sym似乎有效。我认为:是进行哈希而不是rocket的首选方法。您不能避免使用rocket,尤其是字符串键。请参阅答案。谢谢,这非常有用。