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

理解ruby方法定义中的隐式哈希,ruby,Ruby,我正在观看Youtube视频,其中讨论了在方法定义中使用默认值指定参数的不同方法 他讨论了在Ruby 2.0中如何使用一些语法糖,允许您指定一个隐式散列,该散列还为该散列中的每个键设置默认值。位于视频的第页,但我将重新显示以下代码: 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 我很难理解为什么将隐式散列转

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

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

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})

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

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

你可以这样写:

def foo(opts = arbitrary_hash)

这意味着该方法只有一个参数,其默认值是任意散列的值,但这是一种不寻常的方法,因为如果将任何参数传递给该方法,则不会应用任何默认值。

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

你可以这样写:

def foo(opts = arbitrary_hash)

这意味着该方法只有一个参数,其默认值是任意散列值,但这是一种不寻常的方法,因为如果将任何参数传递给该方法,则不会应用任何默认值。

尚未观看该视频,但“隐式散列”是一个糟糕的词语选择。这是一个叫做“关键字参数”的特性,它有一个非常特殊的语法,是的,类似于散列,但不是散列

例如,它允许必需的参数,这在散列中是不可能的

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

我没有看过那个视频,但“隐式哈希”是一个糟糕的词汇选择。这是一个叫做“关键字参数”的特性,它有一个非常特殊的语法,是的,类似于散列,但不是散列

例如,它允许必需的参数,这在散列中是不可能的

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

我只是看了这段视频,因为我很惊讶彼得·库珀会使用如此粗制滥造的术语。事实证明,视频中根本没有提到隐式散列。我只是看了视频,因为我很惊讶Peter Cooper会使用如此粗制滥造的术语。事实证明,视频中根本没有提到隐式散列。