如何不在 Ruby 函数中混合 hash 和 keywordArgument?
How not to mix hash and keywordArgument in a Ruby function?
def passingHash(it)
p it
end
def passingKeywordArg(name: 'David', number: 15)
p name
p number
end
# We actually pass a hash here.
passingHash(name: "hello", number: 100) # Print {:name=>"hello", :number=>100}
# These are two arguments.
passingKeywordArg(name: "hello", number: 100) # Print "hello" 100
我正在学习 Ruby。我发现这两个调用看起来一样,但它们的参数完全不同。在这里推荐使用 => 来表示散列吗?我查了一下这个 code style guideline 发现 => 不推荐使用。我是不是误会了什么?
本教程并不是说使用 =>
(又名 "hash-rocket")不好,而是说使用字符串或除符号 (:foo
) 之外的其他对象会占用更多内存。
{ :foo => 'bar' }
是将符号定义为键的原始方式。比较这两个定义:
{ :foo => 'bar' } # => {:foo=>"bar"}
{ foo: 'bar' } # => {:foo=>"bar"}
我们倾向于使用 foo:
,因为我们是 lazy。
符号没有那么贵,但这是一个不同的主题,为什么可以通过一些搜索找到。
作为开发人员,我们需要了解使用一种算法或对象与使用另一种算法或对象的成本。使用字符串或其他任何东西作为键都有它的时间和地点,知道这些可以节省大量内存或开发时间。
最后,风格指南很有用;定期阅读其中的一些,并考虑他们的建议。这些指南旨在帮助团队遵循适用于 Ruby 的良好编码实践,以通用且一致的方式进行编写,但它们并非一成不变。知道为什么推荐它们很重要,因为有时我们不得不忽略或违反规则,但是,当我们这样做时,我们最好准备好在代码审查中解释原因。
而且,如果您不熟悉 Ruby 的编码风格,我建议您学习 Rubocop,这是一个很好的工具,用于检查一致和可接受的编程风格,以及捕获错误。
除了 The Tin Man 的回答之外,这里还有关于传递关键字参数的更多细节。
Ruby 有一些 syntax sugar 将散列转换为关键字参数,将关键字参数转换为散列。
当您 运行 passingHash(name: "hello", number: 100)
、Ruby 看到 passingHash
采用单个位置参数并将其转换为 passingHash({name: "hello", number: 100})
时,您会得到一个哈希.
当您 运行 passingKeywordArg(name: "hello", number: 100)
时,Ruby 看到 passingKeywordArg
接受关键字参数并保留它。您将获得单独的关键字参数。
您也可以编写 passingKeywordArg({name: "hello", number: 100})
,其中 Ruby 将转换为关键字参数,但更多的是 deprecated in 2.7 and removed in 3.0。
passingKeywordArg("name" => "hello", "number" => 100)
将不起作用。在这种情况下,您将 Strings as keys. Ruby will not turn strings into keywords. passingKeywordArg(name: "hello", number: 100)
uses Symbols, not a String 作为键传递,Ruby 会将符号转换为关键字。
结论:{ "name" => "hello", "number" => 100 }
使用字符串键创建一个哈希。 { name: "hello", number: 100 }
使用符号键创建哈希。 Ruby 会将符号转换为关键字参数,而不是字符串。
def passingHash(it)
p it
end
def passingKeywordArg(name: 'David', number: 15)
p name
p number
end
# We actually pass a hash here.
passingHash(name: "hello", number: 100) # Print {:name=>"hello", :number=>100}
# These are two arguments.
passingKeywordArg(name: "hello", number: 100) # Print "hello" 100
我正在学习 Ruby。我发现这两个调用看起来一样,但它们的参数完全不同。在这里推荐使用 => 来表示散列吗?我查了一下这个 code style guideline 发现 => 不推荐使用。我是不是误会了什么?
本教程并不是说使用 =>
(又名 "hash-rocket")不好,而是说使用字符串或除符号 (:foo
) 之外的其他对象会占用更多内存。
{ :foo => 'bar' }
是将符号定义为键的原始方式。比较这两个定义:
{ :foo => 'bar' } # => {:foo=>"bar"}
{ foo: 'bar' } # => {:foo=>"bar"}
我们倾向于使用 foo:
,因为我们是 lazy。
符号没有那么贵,但这是一个不同的主题,为什么可以通过一些搜索找到。
作为开发人员,我们需要了解使用一种算法或对象与使用另一种算法或对象的成本。使用字符串或其他任何东西作为键都有它的时间和地点,知道这些可以节省大量内存或开发时间。
最后,风格指南很有用;定期阅读其中的一些,并考虑他们的建议。这些指南旨在帮助团队遵循适用于 Ruby 的良好编码实践,以通用且一致的方式进行编写,但它们并非一成不变。知道为什么推荐它们很重要,因为有时我们不得不忽略或违反规则,但是,当我们这样做时,我们最好准备好在代码审查中解释原因。
而且,如果您不熟悉 Ruby 的编码风格,我建议您学习 Rubocop,这是一个很好的工具,用于检查一致和可接受的编程风格,以及捕获错误。
除了 The Tin Man 的回答之外,这里还有关于传递关键字参数的更多细节。
Ruby 有一些 syntax sugar 将散列转换为关键字参数,将关键字参数转换为散列。
当您 运行 passingHash(name: "hello", number: 100)
、Ruby 看到 passingHash
采用单个位置参数并将其转换为 passingHash({name: "hello", number: 100})
时,您会得到一个哈希.
当您 运行 passingKeywordArg(name: "hello", number: 100)
时,Ruby 看到 passingKeywordArg
接受关键字参数并保留它。您将获得单独的关键字参数。
您也可以编写 passingKeywordArg({name: "hello", number: 100})
,其中 Ruby 将转换为关键字参数,但更多的是 deprecated in 2.7 and removed in 3.0。
passingKeywordArg("name" => "hello", "number" => 100)
将不起作用。在这种情况下,您将 Strings as keys. Ruby will not turn strings into keywords. passingKeywordArg(name: "hello", number: 100)
uses Symbols, not a String 作为键传递,Ruby 会将符号转换为关键字。
结论:{ "name" => "hello", "number" => 100 }
使用字符串键创建一个哈希。 { name: "hello", number: 100 }
使用符号键创建哈希。 Ruby 会将符号转换为关键字参数,而不是字符串。