为什么“splatting”关键字参数时 ** 是可选的?

2023-12-23

鉴于此方法定义:

def foo(a = nil, b: nil)
  p a: a, b: b
end

当我使用单个哈希参数调用该方法时,哈希总是隐式转换为关键字参数,无论**:

hash = {b: 1}
foo(hash)     #=> {:a=>nil, :b=>1}
foo(**hash)   #=> {:a=>nil, :b=>1}

我可以传递另一个(空)哈希作为解决方法:

foo(hash, {}) #=> {:a=>{:b=>1}, :b=>nil}

But,这看起来相当麻烦和尴尬。

我希望 Ruby 能够像处理数组一样处理这个问题,即:

foo(hash)     #=> {:a=>{:b=>1}, :b=>nil}
foo(**hash)   #=> {:a=>nil, :b=>1}

并使用文字:

foo({b: 1})   #=> {:a=>{:b=>1}, :b=>nil}
foo(b: 1)     #=> {:a=>nil, :b=>1}
foo(**{b: 1}) #=> {:a=>nil, :b=>1}

当前的实现看起来像是一个缺陷,而我期望它的工作方式似乎是显而易见的。

这是一个被忽视的边缘情况吗?我不这么认为。没有以这种方式实施可能有充分的理由。

有人可以启发我吗?


  1. 至于缺乏** part:

    我的猜测是,为了使方法调用简单,Ruby 总是解释一次key: value不带大括号的形式作为省略大括号的散列,无论它实际上是被解释为这样的散列还是关键字参数。

    然后,为了将其解释为关键字参数,**隐式地应用于它。

    因此,如果您传递了显式哈希,则它对上面的过程不会产生影响,并且有空间将其解释为实际哈希或关键字参数。

    当你通过时会发生什么**明确地喜欢:

    method(**{key: value})
    

    是散列被分解:

    method(key: value)
    

    then 被解释为省略大括号的哈希:

    method({key: value})
    

    then 被解释为散列或关键字参数。

  2. 至于优先于其他参数的关键字参数,请参阅 Ruby core 上的这篇文章:https://bugs.ruby-lang.org/issues/11967 https://bugs.ruby-lang.org/issues/11967.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么“splatting”关键字参数时 ** 是可选的? 的相关文章

随机推荐

  • 无法使用 rdd.toDF() 但spark.createDataFrame(rdd) 有效[重复]

    这个问题在这里已经有答案了 我有一个以下形式的 RDDRDD string List Tuple 如下所示 u C1589 HG02922 83779208 2 677873089 0 当尝试运行以下代码将其转换为数据帧时 spark cr
  • 如何将图标和输入文本放在同一行?

    我想在左侧放置一个图标 在右侧放置一个输入类型文本 占据所有剩余空间 ico input type text 如果我将两者都设置为display inline block并设置输入的宽度为100 it 越线 因为10
  • 与其他类似类相比,HandlerThread 的最佳使用

    我试图了解使用的最佳用例HandlerThread 根据定义 用于启动具有循环器的新线程的便捷类 然后可以使用循环器创建处理程序类 请注意 仍然必须调用 start 我可能是错的 但我可以通过使用来实现类似的功能Thread Looper
  • `document` 未定义 Electron

    我正在尝试使用以下方法从文件中读取 JSONfs模块 并将其显示在div带身份证list在电子应用程序中 我的代码在index js看起来像这样 dialog showOpenDialog filenames gt if filenames
  • 如何从另一个目录获取 ruby​​ 文件

    我试图要求一个我在另一个文件中创建的 rake 文件 这两个文件位于两个不同的目录中 我在第一个文件的顶部有 require 在 require 之后的引号内有第二个文件的名称 它告诉我它无法加载此类文件 这是否意味着因为它位于不同的目录中
  • Pandas 从同一数据框中减去 2 行

    如何在以下数据帧 df 中从另一行中减去一行 RECL LCC 1 2 3 RECL LCC 35 107655 36 015210 28 877135 RECL PI 36 961519 43 499506 19 538975 我想做类似
  • Django FormView 和分页

    如果表单有效 我正在使用 django 的 FormView 返回对象集 我的视图函数是这样的 class IdeaView FormView template name contributor browse photo html def
  • 无法启动应用程序(CreateProcess 错误=87),无法使用缩短类路径解决方法

    当我在 Windows 上的 Eclipse 中启动应用程序时 我收到以下错误 执行命令行时发生异常 无法运行程序 CreateProcess error 87 参数不正确 我过去通过缩短 CLASSPATH 解决了这个问题 我现在已经到了
  • 如何维护 Web 应用程序中的状态 - 因为 HTTP 是无状态的

    我是构建 Web 应用程序的新手 刚刚开始学习和设置 Grails 我计划构建一个具有 4 到 5 页流程的应用程序 由于HTTP是无状态协议 那么通常页面之间的状态是如何维护的 我很好奇这里接受的标准是什么 我应该创建会话范围的对象并在页
  • 与 ASP.NET MVC 2 中的 SelectList 作斗争

    我有一个看起来像这样的模型 public class SampleModel public static SampleModel Create return new SampleModel Boolean true set several
  • 如何从命令行打开 SourceTree?

    有没有一种快速简单的方法可以从命令行打开 SourceTree 中的 git 存储库 我从终端做了很多 git 工作 但有时没有什么可以替代良好的历史视图 差异 希望能够在不使用书签的情况下打开 安装 SourceTree 命令行工具将为您
  • 如何从完成块中检索返回值?

    是否可以在主线程上运行完成块 例如 我有一个返回值的方法 int test here one method is called with completion block with return type void obj somemeth
  • 使用 sqlmodel 在 fastapi 中深度嵌套响应模型

    我想在这里重复一下之前的内容question https stackoverflow com questions 74719687 getting joined tables from sqlmodel as a nested respon
  • 将静态库链接到其他静态库

    我有一小段代码依赖于许多静态库 a 1 a n 我想将该代码打包在静态库中并使其可供其他人使用 我的静态库 我们称之为 X 编译得很好 我创建了一个简单的示例程序 它使用 X 中的函数 但是当我尝试将其链接到 X 时 我收到许多关于缺少库
  • 在 Unity3d 中打开 iPhone 和 Android 设备相机

    我正在开发一个应用程序 需要在全视图中打开设备摄像头 并且我正在为 iOS 和 Android 制作这个应用程序 那么谁能告诉我如何在 Unity 中为所有 Android 和 iPhone 设备打开全屏设备摄像头 这对我来说会有很大的帮助
  • 选择另一个选项卡时的 popToRootViewController

    Context 我同时使用 TabViewController 和 NavigationController 这两个选项卡是RECENT and POPULAR他们会显示帖子列表 想象你在里面RECENT选项卡并单击帖子 您将进入posts
  • 是否可以设置现有 Azure blob 的内容处置?

    基于刺激在这里的答案 Azure 存储 API 内容配置 https stackoverflow com questions 20719641 azure storage api contentdisposition 以及在这里找到的信息
  • 如何使用 PendingIntent 从服务到客户端/活动进行通信?

    我一直在 Android 开发者网站上阅读以下文本 特别是在框架主题 gt 服务 gt 启动服务 http developer android com guide topics fundamentals services html Star
  • if else 在mysql中查询

    我需要 mysql 查询中嵌套 if else 条件的示例 您还可以将 case 语句用于 if else 条件 SELECT CASE field1 WHEN A THEN value is A WHEN B THEN value is
  • 为什么“splatting”关键字参数时 ** 是可选的?

    鉴于此方法定义 def foo a nil b nil p a a b b end 当我使用单个哈希参数调用该方法时 哈希总是隐式转换为关键字参数 无论 hash b 1 foo hash gt a gt nil b gt 1 foo ha