了解ruby方法定义中的隐式哈希

时间:2016-09-01 14:54:12

标签: ruby

我正在观看CooperPress Youtube视频,该视频讨论了在方法定义中使用默认值指定参数的不同方法。

他讨论了如何在Ruby 2.0中使用一些语法糖,它允许您指定隐式哈希,该哈希还为此哈希中的每个key设置默认值。位于视频的this part,但我将重新显示以下代码:

def some_method(x: 10, y: 20, z: 30)
  puts x
  puts y
  puts z
end

some_method x: 1, y: 2

=> 1
=> 2
=> 30

我无法理解的是为什么将隐式哈希转换为显式哈希不起作用。基本上:我所做的就是在方法定义中围绕隐式哈希参数进行花括号。正如我所看到的:在键/值周围加上花括号只是一种更明确的方式来表示哈希包装这些键/值,它应该具有完全相同的行为。但是,当我这样做时,它会出错:

def some_method({x: 10, y: 20, z: 30}) #curly braces here
  puts x
  puts y
  puts z
end

some_method x: 1, y: 2

=> rb:1: syntax error, unexpected {, expecting ')' def some_method({x: 10, y: 20, z: 30})

问题:为什么将方法定义中的隐式哈希参数转换为显式哈希参数会导致方法错误?

2 个答案:

答案 0 :(得分:2)

Haven没有看过那个视频,但是"隐含的哈希"是一个糟糕的选择。这是一个名为"关键字参数的功能"它有一个非常具体的语法,是的,类似于哈希,但不是一个。

例如,它允许必需的参数,这在哈希中是不可能的。

def foo(required:, optional: 1)
  # some code
end

答案 1 :(得分:1)

在方法参数定义中可以编写的内容有特殊的语法规则,不能只写任意表达式。

你可以这样写:

def foo(opts = arbitrary_hash)

这意味着该方法有一个参数,其默认值是arbitrary_hash,但这是一种不寻常的方式,因为如果你将任何参数传递给方法,没有任何默认值得到应用