在这个关于模式匹配的interesting blog post页上,有一些方法签名为(*)的代码

class Request < Data.define(:path, :scheme, :format)
  def deconstruct_keys(*)
    { path: @path, scheme: @scheme, format: @format }
  end

  def deconstruct(*)
    path.split("/").compact
  end
end

这不同于

def a_method(*args)

我在Ruby docs中找不到任何信息.

def deconstruct_keys(*)是什么意思?

推荐答案

def a_method(*args)
  ...
end

通常,当我们编写这段代码时,我们会得到存储在args变量中的所有方法参数的列表.

def a_method(*)
  ...
end

这是相同的匿名形式.我们接受任意数量的参数,但不希望为该列表变量命名.现在,这与Python中的*不同(它实际上只是丢弃了参数).在Ruby中,我们没有给参数列表命名,但我们仍然可以将其拆分到另一个参数列表中.所以虽然这isn't是合法的

def a_method(*)
  # Should've just named it in the first place :(
  args = *
  ...
end

另一方面,这是

def a_method(*)
  another_method(*)
end

并将参数传递给another_method.它相当于

def a_method(*args)
  another_method(*args)
end

使用Ruby 3关键字参数也可以做到这一点

def a_method(**)
  another_method(**)
end

请注意,如果您打算转发all个参数,则应使用省略号语法.

def a_method(...)
  another_method(...)
end

当委托关键字参数时,单独的*会表现得很滑稽.例如,

def foo(*args, **kwargs)
  p args
  p kwargs
end

def bar(*)
  foo(*)
end

foo(1, a: 1) # Prints [1] then {:a=>1}
bar(1, a: 1) # Prints [1, {:a=>1}], then {}

当直接调用foo时,命名参数语法被传递给**kwargs,但当通过bar委托时,它被转换为散列,然后传递到*args.最重要的是,*也不会转发块参数,而...是通用的"将所有位置参数、命名参数和块参数向前传递".

Ruby相关问答推荐

带有(*)签名的Ruby方法

从同名方法调用 ruby​​ 中的方法

如何在 Shopify 脚本编辑器中显示数组值?

Ruby符号前面的-是什么意思?

我可以在 Ruby 中使用默认值创建一个数组吗?

Ruby访问嵌套函数中的外部变量

如何在 VIM 中导航 Ruby 方法?

将 2 元素数组的数组转换为哈希,其中重复键附加附加值

Ruby 中的 Object 和 BasicObject 有什么区别?

在单个 node 上使用 XPath 返回所有 node 中的元素

确定字符串数组是否包含ruby中的某个子字符串

rspec 是否有比 target.should < 6 更具体的东西?

确定一个值是否存在于哈希数组中

使用 Ruby 将大写字符串转换为标题大小写

Sublime Text 2 控制台输入

在 Ruby 中查找内存泄漏的原因

在 Ruby 中, coerce() 是如何工作的?

如何在没有警告的情况下重新定义 Ruby 常量?

找不到Bundle 命令 mac

将整个文本文件作为单个字符串读取的合理方法是什么?