【问题标题】:Inconsistent implicit hash creation in Ruby?Ruby 中的隐式哈希创建不一致?
【发布时间】:2010-05-15 01:43:19
【问题描述】:

好的,所以我将我自己的 DSL 中的一些东西与 Ruby 进行了比较。他们都支持的一种构造是这样的

x=["key" => "value"]

知道数组和哈希的区别,我认为这是非法的,但是 Ruby 中的结果是

[{"key" => "value"}]

这是为什么?有了这种语法,你为什么不能这样做

x=("key" => "value") 

为什么数组是隐式创建哈希的特例?

【问题讨论】:

    标签: ruby arrays syntax hash


    【解决方案1】:

    另一种特殊情况是在函数调用中,请考虑:

    def f(x)
      puts "OK: #{x.inspect}"
    end
    f("foo" => "bar")
    => OK: {"foo"=>"bar"}
    

    所以在某些情况下,可以隐式构建哈希(通过检测=> 运算符?)。我想答案是,这是 Matz 最不令人惊讶的行为。

    【讨论】:

    • 这是最接近的答案。它只是语法的一部分。在#RubyOnRails 中聊了一些,发现它是 Ruby 语法的一部分。
    【解决方案2】:

    由于隐式哈希创建的这种明显不一致,ruby 在这方面实现了一致性:

    func(whatever...)
    

    总是可以替换为:

    args = [whatever...]
    func(*args)
    

    您可以在参数列表和数组之间进行转换,因此它们具有相同的语法是合乎逻辑的。

    【讨论】:

      【解决方案3】:

      我会说解释器会发现 "key" => "value" 是一个散列,就像当您将 5 放入数组时它会发现 5 是一个数字一样。
      所以如果你写:

      x = [5]
      

      解释器不会认为它是一个字符串,并返回:

      x = ["5"]
      

      似乎 ruby​​ 在某些情况下会隐式创建哈希值。

      【讨论】:

      • 是的,但是x=(5)x=("5") 都是有效的(括号只是为了尽可能消除歧义)所以为什么不x=("key" => "value") 为什么你可以把它放在一个数组中而不是直接放入变量?
      • @Earlz - 您不能将其直接放入变量中,因为它不像字符串或数字那样。它显示了哈希中两个项目之间的关联。似乎当您在数组中初始化它时,它会将其转换为哈希,但是当您尝试将其放入变量时它不会
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-03
      • 2012-11-23
      • 2014-12-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多