【发布时间】:2010-05-15 01:43:19
【问题描述】:
好的,所以我将我自己的 DSL 中的一些东西与 Ruby 进行了比较。他们都支持的一种构造是这样的
x=["key" => "value"]
知道数组和哈希的区别,我认为这是非法的,但是 Ruby 中的结果是
[{"key" => "value"}]
这是为什么?有了这种语法,你为什么不能这样做
x=("key" => "value")
为什么数组是隐式创建哈希的特例?
【问题讨论】:
好的,所以我将我自己的 DSL 中的一些东西与 Ruby 进行了比较。他们都支持的一种构造是这样的
x=["key" => "value"]
知道数组和哈希的区别,我认为这是非法的,但是 Ruby 中的结果是
[{"key" => "value"}]
这是为什么?有了这种语法,你为什么不能这样做
x=("key" => "value")
为什么数组是隐式创建哈希的特例?
【问题讨论】:
另一种特殊情况是在函数调用中,请考虑:
def f(x)
puts "OK: #{x.inspect}"
end
f("foo" => "bar")
=> OK: {"foo"=>"bar"}
所以在某些情况下,可以隐式构建哈希(通过检测=> 运算符?)。我想答案是,这是 Matz 最不令人惊讶的行为。
【讨论】:
由于隐式哈希创建的这种明显不一致,ruby 在这方面实现了一致性:
func(whatever...)
总是可以替换为:
args = [whatever...]
func(*args)
您可以在参数列表和数组之间进行转换,因此它们具有相同的语法是合乎逻辑的。
【讨论】:
我会说解释器会发现 "key" => "value" 是一个散列,就像当您将 5 放入数组时它会发现 5 是一个数字一样。
所以如果你写:
x = [5]
解释器不会认为它是一个字符串,并返回:
x = ["5"]
似乎 ruby 在某些情况下会隐式创建哈希值。
【讨论】:
x=(5) 和x=("5") 都是有效的(括号只是为了尽可能消除歧义)所以为什么不x=("key" => "value") 为什么你可以把它放在一个数组中而不是直接放入变量?