【问题标题】:Ruby keyword arguments syntax explanationRuby 关键字参数语法解释
【发布时间】:2016-01-15 10:52:08
【问题描述】:

如果我们有这样定义的create_widget 方法:

def create_widget(size, properties)
  puts properties.class #=> Hash
  puts properties[:id] #=> table22
end

有什么区别:

create_widget(6, {:id => "table22", :class => "Cart"})
create_widget(6, :id => "table22", :class => "Cart")
create_widget(6, id: "table22", class: "Cart")

在任何情况下,第二个参数都是Hash,并呈现相同的结果。

【问题讨论】:

  • 它们的解释方式都相同,只是语法有所不同。

标签: ruby hash syntactic-sugar keyword-argument


【解决方案1】:

您的所有三行在功能上都是相同的。

哈希对象使用花括号{} 声明,Ruby 开始将键和值与火箭=> 配对。因此,在将其传递给函数时声明一个看起来就像您的第一行。

create_widget(6, {:id => "table22", :class => "Cart"})

为了方便和简洁的语法,如果 Hash 是最后一个参数,Ruby 允许您省略 {},这会得到第 2 行。这是许多接受某种额外选项 hash 的方法的常见习惯用法:

def create_widget(number, properties = {}); end
create_widget(6, :id => "table22", :class => "Cart")

Ruby 1.9 引入了冒号 : 语法来替换火箭 => 当你的键是符号时,导致第 3 行:

create_widget(6, id: "table22", class: "Cart")

因此,在这些情况下,差异纯粹是视觉上的。请注意,如果您有非符号键,则需要使用 Rocket => 语法。欢迎您将它们混合在同一个哈希中:

create_widget(6, "id" => "table22", class: "Cart")

另外值得注意的是,Ruby 2 引入了关键字参数,看起来与第 3 行相同。除了人们从选项哈希中得到的描述性名称之外,关键字参数还为您提供了排序灵活性。它们还让您可以比选项哈希更轻松地设置默认值,因此 create_widget 可能如下所示:

def create_widget(number, id:, class: "Cart")

id: 声明我们已将参数命名为id,并且它没有默认值,因此它是必需的。另一方面,class: "Cart" 将默认为"Cart",因此是可选的。现在所有这些调用的行为都是一样的:

create_widget(6, id: "table22")
create_widget(6, id: "table22", class: "Cart")
create_widget(6, class: "Cart", id: "table22")

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-01-28
    • 2013-06-09
    • 1970-01-01
    • 2017-08-08
    • 1970-01-01
    • 2020-03-25
    • 2017-03-15
    相关资源
    最近更新 更多