Ruby,Splat 的源代码?

Posted

技术标签:

【中文标题】Ruby,Splat 的源代码?【英文标题】:Ruby, Source Code of Splat? 【发布时间】:2010-10-29 14:46:03 【问题描述】:

昨天有人问起 splat 运算符,我想看看源代码……那是用 C 写的还是用 Ruby 写的?在哪里可以找到?

【问题讨论】:

【参考方案1】:

一些快速的 Google 搜索发现它在 eval.c 中实现。您可以在文件中的几个位置找到对“splat”的引用,但我对 Ruby 的内部工作原理不够熟悉,无法理解它。

【讨论】:

谢谢你,马丁。只是试图理解 Ruby 世界。所以基本上,如果它是 ruby​​ 而不是 rails,那么源代码可能不在 Ruby 中,这是有道理的。 splat 运算符是核心 ruby​​ 语言的一部分,而不是库功能。它可以用于定义了#to_ary 方法的任何对象,但是当用于将多个值收集到单个变量中时(如a, *b = 1,2,3,4,5),它将始终创建一个数组。 @Rampion,谢谢。所以我想我真正的问题是:是否有任何不需要“要求”的“库功能”(其源代码在 Ruby 中)?【参考方案2】:

从 Ruby 2.4 开始,splat 操作符在核心 Ruby 文档中的文档很少。不过,它是该语言的核心功能,splat 运算符的源代码可以在vm_eval.c 下的rb_yield_splat(VALUE values) 中找到。

rb_yield_splat 的 unit test 让正在发生的事情更加清晰:

it "yields with passed array's contents" do
  ret = nil
  @s.rb_yield_splat([1, 2])  |x, y| ret = x + y 
  ret.should == 3
end

【讨论】:

很好,但你怎么知道源在哪里? 我在 Ruby git 存储库中 searched for it。将搜索限制为 C 文件,然后阅读源代码,直到找到为止。 哇,太好了。谢谢。

以上是关于Ruby,Splat 的源代码?的主要内容,如果未能解决你的问题,请参考以下文章

了解范围和数组中的 ruby​​ splat

为啥带有 splat 参数的 Ruby 过程/块的行为与方法和 lambda 不同?

Ruby 中的关键字参数解包(splat)

如何在 Ruby 中为 splat 参数设置默认值

ruby 在案例时使用带阵列的splat

ruby 使用splat进行方法参数