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,尤其是字符串键。请参阅答案。谢谢,这非常有用。