Ruby koan 124 - 这些符号会自发地改变类型吗?

Ruby koan 124 - Are these symbols spontaneously changing type?

我想得到关于符号如何(以及为什么)会改变类型的明确答案。

我了解到以冒号结尾的符号是声明符号的替代语法,通常用于填充哈希值。

Koan 编号 124 通过执行以下操作使我的(非)理解更加模糊:

def method_with_keyword_arguments(one: 1, two: 'two')
  [one, two]
end

本页:
http://chriszetter.com/blog/2012/11/02/keyword-arguments-in-ruby-2-dot-0/
Keyword arguments in the method definition must be symbols given in the new-style hash syntax 但随后在方法参数中出现的符号是返回数组中的方法变量。

符号是否可以更改 'type' 而无需通过方法进行更改?或者,在这种情况下,是否有一种我没有看到的方法正在改变类型?如果类型无关紧要,为什么它看起来会发生变化?或者可以不用冒号引用符号吗?

如果我有任何错误,请随时纠正我,让我知道到底发生了什么!谢谢

不,符号不能自行更改类型,但是当您在示例中使用 onetwo 时,您正在使用具有相似名称的变量,由 Ruby 根据您的方法定义提供,而不是符号本身

考虑一个散列:当你有一个散列 a = { one: 1, two: '1234' } 并且你写 a[:one] 你没有得到一个符号,而是一个合适的值。所以 :one 仍然是一个符号,但是使用 [a[:one], a[:two]] 你会得到 [1, '1234'] 数组,而不是 [:one, :two].

这里没有符号。 onetwo是参数,参数在方法体中成为局部变量

def foo(bar:, baz:)

barbaz 不再是

中的符号
def foo(bar, baz)

第一种情况是关键字参数,第二种情况是位置参数,除此之外没有区别。在参数列表中,它们是参数占位符,在方法体中,它们成为绑定参数的局部变量。