加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ruby-on-rails – 在Ruby中使用带有splats的下划线

发布时间:2020-12-17 03:49:53 所属栏目:百科 来源:网络整理
导读:我通过其他几个指南跟踪 Why’s (Poignant) Guide to Ruby到 Ruby style guide,看看Rubyists的想法. 但这是我第一次看到尾随下划线.这些是什么东西?它们是否有用,如果是,我们何时使用它们以及如何将它们与splat运算符一起使用? (Ruby样式指南链接锚定到实
我通过其他几个指南跟踪 Why’s (Poignant) Guide to Ruby到 Ruby style guide,看看Rubyists的想法.
但这是我第一次看到尾随下划线.这些是什么东西?它们是否有用,如果是,我们何时使用它们以及如何将它们与splat运算符一起使用?

(Ruby样式指南链接锚定到实际示例)

解决方法

合法变量名称为_.类似* _的东西类似于* x.术语尾随下划线变量实际上是指赋值语句左侧的逗号分隔变量系列中的最后一个变量名,例如:

a,b,_ = [1,2,3,4]

splat运算符有两个用途:

>将数组分解为各个项目.
>将项目收集到一个数组中.

发生了哪些取决于使用splat运算符的上下文.

以下是Ruby风格指南所说的不好的例子:

a,_ = *foo

该示例中的尾随下划线变量是不必要的,因为您可以通过编写将foo的前两个元素分配给变量a和b:

a,b = *foo

下划线变量用于表示,我不关心这个变量,因此在该示例中没有必要,如果您想要做的就是分配给a和b.

该示例也可能被认为是错误的样式,因为也不需要*运算符(credit:Cary Swoveland):

a,b = [1,3]
p a,b

--output:--
1
2

*可以在右侧使用,效果如下:

x,y,z = 10,[20,30]
p x,z

--output:--
10
[20,30]
nil

x,*[20,z

--output:--
10
20
30

所以,请记住,在样式指南的其余示例中,*在右侧是多余的.

下一个坏例子是:

a,_,_ = *foo

这是一个更具体的例子:

a,_ = *[1,4]
p a,_

puts "-" * 10

a,_

--output:--
1
3
----------
1
2

下面显示了分配在示例的第一部分中的工作方式:

a,_
 ^  ^  ^
 |  |  |
[1,4]

在任何情况下,如果你摆脱了左边的第二个下划线变量,那么a将分配相同的东西.如何摆脱两个下划线变量?

a = *[1,4]
p a

--output:--
[1,4]

不.所以左边的第一个下划线变量似乎是必要的.但是,还有另一种语法可以在不使用尾随下划线变量的情况下获得相同的结果:

a,= *[1,4]
p a

--output:--
1

因此,第三个坏例子:

a,*_ = *foo

也可以写成:

a,= *foo

从而避免尾随下划线变量.

最后,风格指南提供了这个神秘的建议:

Trailing underscore variables are necessary when there is a splat
variable defined on the left side of the assignment,and the splat
variable is not an underscore.

我认为这可能是指这样的事情:

*a = *[1,4]

如果你想为a分配数组的前三个元素,那么你必须写:

*a,3]

无论出于何种原因,解析器无法处理:

*a,4]

--output:--
*a,4]
     ^
1.rb:6: syntax error,unexpected 'n',expecting :: or '[' or '.'

这是一个很好的例子:

*a,_ = *foo

如果要将第二个元素分配给foo的最后一个元素,则必须使用尾随下划线变量.

以下好例子有点令人困惑:

a,_b = *[1,4]
a,_b,4]

我们来试试吧:

a,_b

puts "-" * 10

a,_b

--output:--
1
2
----------
1
2

在ruby中,变量名称(如_b)与名为_或b的变量没有区别.在函数式语言中,如Erlang,变量_和_B和B具有不同的效果 – 但在Ruby中却没有.

顺便说一句,我不会花五分钟学习这种风格 – 这太深奥了.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读