双星号(splat)运算符的作用是什么?

10 浏览
0 Comments

双星号(splat)运算符的作用是什么?

你见过像这样声明的函数吗?\n

def foo a, **b
  ...
end

\n我知道单个的*是展开操作符。那么**是什么意思呢?

0
0 Comments

问题:双星号(splat)运算符的作用是什么?

原因:

在上述代码中,使用双星号(splat)运算符时产生了一个错误。原因是函数foo()定义了一个参数opts,但在调用函数时传递了两个参数,导致参数数量不匹配。

解决方法:

为了解决参数数量不匹配的问题,可以使用双星号(splat)运算符来传递一个参数字典。双星号(splat)运算符的作用是将一个字典展开为多个关键字参数。

整理后的文章如下:

在上述代码中,我们可以看到双星号(splat)运算符的使用。当我们调用函数foo()时,传递了一个参数字典bar,并且额外传递了一个关键字参数c。

然而,由于函数foo()定义了一个参数opts,而不是接收关键字参数,所以在调用函数时产生了一个错误。错误信息显示给定了2个参数,但期望只有1个参数。

为了解决这个问题,我们可以使用双星号(splat)运算符来传递一个参数字典。双星号(splat)运算符的作用是将一个字典展开为多个关键字参数。

通过使用双星号(splat)运算符,我们可以将参数字典bar展开,并将其作为关键字参数传递给函数foo()。这样,函数foo()就可以正确接收到参数,并输出正确的结果。

双星号(splat)运算符在这里的作用是将一个参数字典展开为多个关键字参数,以解决函数调用时参数数量不匹配的问题。它的使用类似于ES6中的对象展开运算符。

通过使用双星号(splat)运算符,我们可以避免参数数量不匹配的错误,并正确传递参数给函数。这为我们的编程工作提供了便利和灵活性。

0
0 Comments

Ruby 2.0引入了双星号(double splat)运算符,它可以捕获所有的关键字参数(也可以是一个简单的哈希,在Ruby语言中引入关键字参数之前,这是模拟关键字参数的惯用方式)。

举个例子,下面的代码使用了双星号运算符:

def my_method(**options)
  puts options.inspect
end
my_method(key: "value")

上面的代码会将 `{key: value}` 打印到控制台。

一个实际的例子是Rails中的 `cycle` 方法,它的定义如下:

def cycle(first_value, *values)
  options = values.extract_options!
  # ...
end

该方法可以这样调用:`cycle("red", "green", "blue", name: "colors")`。这是一种常见的模式:接受一系列参数,并且最后一个参数是一个选项哈希,可以使用 ActiveSupport 的 `extract_options!` 方法来提取它。

在Ruby 2.0中,你可以简化这些方法的定义:

def cycle(first_value, *values, **options)
  # 与上面的代码相同,不需要进一步更改!
end

可以看到,如果你已经在使用 ActiveSupport,这只是一个微小的改进,但是对于纯Ruby代码而言,代码会更加简洁。

0
0 Comments

Ruby 2.0引入了关键字参数,**的作用类似于*,但用于关键字参数。它返回一个具有键/值对的哈希。

对于以下代码:

def foo(a, *b, **c)
  [a, b, c]
end

这是一个演示:

> foo 10
=> [10, [], {}]
> foo 10, 20, 30
=> [10, [20, 30], {}]
> foo 10, 20, 30, d: 40, e: 50
=> [10, [20, 30], {:d=>40, :e=>50}]
> foo 10, d: 40, e: 50
=> [10, [], {:d=>40, :e=>50}]

这完美地回答了问题,但我有一个小附加说明。就像可以在传递的数组上使用splat运算符一样,双splat可以在哈希上使用。如果opts = {d: 40, e: 50},那么foo 10, opts, f: 60将把{f: 60}赋值给c,而foo 10, **opts, f: 60将把{d: 40, e: 50, f: 60}赋值给c。为了实现第二个效果,以前必须显式地使用merge数组。

我认为这对于为方法设置可选的哈希参数很有用。

可能值得注意的是,如果在关键字参数与关键字splat混合使用时,关键字splat需要放在关键字参数之后。

这10行代码做到了无数文章做不到的事情。太棒了!

0