Ruby on rails 还有其他速记吗
我最近遇到了这个问题:Ruby on rails 还有其他速记吗,ruby-on-rails,ruby,Ruby On Rails,Ruby,我最近遇到了这个问题: 我总是这样使用inject(我知道(0)部分是可选的,可以省略) 我偶然发现您可以使用: array.inject(:+) #=> 49 array.inject(:-) #=> -23 array.inject(:*) #=> 3887 array.inject(:/) #=> 0 在谷歌上搜索这个问题,我发现了一个不错的解决方案,但没有提到我的尝试…… 有人能给我解释一下或提供一些关于我刚才使用的这些注入命令的信息吗?来自以下文档: 。。。如
我总是这样使用inject(我知道(0)部分是可选的,可以省略) 我偶然发现您可以使用:
array.inject(:+)
#=> 49
array.inject(:-)
#=> -23
array.inject(:*)
#=> 3887
array.inject(:/)
#=> 0
在谷歌上搜索这个问题,我发现了一个不错的解决方案,但没有提到我的尝试……有人能给我解释一下或提供一些关于我刚才使用的这些注入命令的信息吗?来自以下文档: 。。。如果改为指定符号,则集合中的每个元素都将传递给memo的命名方法。在任何一种情况下,结果都将成为memo的新值。迭代结束时,memo的最终值是该方法的返回值 如果未明确指定备注的初始值,则使用集合的第一个元素作为备注的初始值 所以,如果您指定一个符号,它会将其视为一个方法名,并在可枚举的每个元素上调用此方法,替换上面提到的memo。现在,数学运算符(+-*/)只不过是方法,其他什么都不是。这些行产生相同的结果:
13 + 23 # => 36
13.+(23) # => 36
13.send(:+, 23) # => 36
将符号传递给inject
或reduce
时,它使用第三种形式将该运算符动态应用于元素:
[1,2,3].inject(:+) # => 6
此速记也可用于除运算符以外的其他方法:
[{"a"=>1}, {"b"=>2}].inject(:merge) # => {"a"=>1, "b"=>2}
另一种速记形式是方法或。我对您的答案进行了编辑,以反映符号语法不仅限于运算符,还可以与其他方法一起使用,因为这对于原始问题来说似乎很重要。希望你不介意编辑!
[{"a"=>1}, {"b"=>2}].inject(:merge) # => {"a"=>1, "b"=>2}