如何不在 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 会将符号转换为关键字参数,而不是字符串。