【问题标题】:Ruby trying to grasp a new notation. (inject(: ) vs select(&:even?); why one has &?)Ruby 试图掌握一种新的符号。 (inject(:) vs select(&:even?); 为什么有 &?)
【发布时间】:2013-05-17 09:22:03
【问题描述】:

所以,我刚刚学会了,而不是写这样的东西:

[1,2,3,4,5].inject {|x,y| x + y} => 15

我会写

[1,2,3,4,5].inject(:+) => 15

我也学会了,而不是写作

[1,2,3,4,5].select {|x| x.even?} => [2,4]

我会写

[1,2,3,4,5].select(&:even?) => [2,4]

我的问题是为什么一个(选择)使用& 而另一个(注入)不使用。我确定: 是因为even?+ 被处理为符号,但我希望澄清为什么& 被用于一个以及为什么: 被使用。

另外,我知道我可以在不止于 injectselect 上使用这些符号。

非常感谢!

【问题讨论】:

    标签: ruby syntax notation


    【解决方案1】:

    & 运算符在这种情况下将符号转换为过程。所以代码在后台执行此操作:

    [1,2,3,4,5].select {|elem| elem.send :even? } # => [2, 4]
    

    inject 方法的实现认识到对这些快捷方法规范的需求,并在符号作为参数传递时添加了特殊处理。所以,在这种情况下,它基本上完成了 & 运算符所做的工作。

    为什么一个(选择)使用 & 而另一个(注入)不使用

    因为没有人以这种方式实现select。 Ruby 是开源的,他们甚至可能接受你的补丁。去解决这个问题:)

    P.S.:但如果由我决定,我会改为 删除 injection 的特殊处理。在存在 Symbol#to_proc (这就是 & 运算符使用的)的情况下,感觉有点多余和混乱。

    【讨论】:

    • 我明白了。非常非常有趣!在 Ruby 中,我发现很多事情都非常简单,就像我在 select 中所做的那样。你前进并写了{|elem| elem.send :even?} 这本质上是我的块在后台做的吗?将自己更改为该格式,然后执行它打算执行的任何计算?在 Ruby 中做事的方式有很多。我很好奇。
    • @David:是的,这就是 select(&:even?) 在幕后所做的。
    • @David 不要忘记接受答案,如果它确实回答了问题!
    • @SergioTulentsev 的回答 = auto +1 ;)
    猜你喜欢
    • 2011-10-07
    • 1970-01-01
    • 2021-10-09
    • 2017-01-09
    • 2012-11-30
    • 1970-01-01
    • 1970-01-01
    • 2013-07-29
    • 2011-05-29
    相关资源
    最近更新 更多