我在RailsCast中找到了这段代码:
def tag_names
@tag_names || tags.map(&:name).join(' ')
end
Run Code Online (Sandbox Code Playgroud)
什么是(&:name)
中map(&:name)
意味着什么?
可能重复:
map(&:name)在Ruby中意味着什么?
在Ruby中,我知道如果我这样做:
some_objects.each(&:foo)
Run Code Online (Sandbox Code Playgroud)
它是一样的
some_objects.each { |obj| obj.foo }
Run Code Online (Sandbox Code Playgroud)
也就是说,&:foo
创建块{ |obj| obj.foo }
,将其转换为Proc,并将其传递给每个块.为什么这样做?它只是一个Ruby特例,还是有理由为什么这样做呢?
可能重复:
map(&:name)在Ruby中意味着什么?
我遇到了一个代码片段,其中包含以下内容
a.each_slice(2).map(&:reverse)
Run Code Online (Sandbox Code Playgroud)
我不知道&:
运营商的功能.这是如何运作的?
我已经看过好几次,但我无法弄清楚如何使用它们.镐说这些是特殊的快捷方式,但我无法找到语法描述.
我在这样的背景下见过他们:
[1,2,3].inject(:+)
Run Code Online (Sandbox Code Playgroud)
以计算总和为例.
我正在阅读Stackoverflow并偶然发现以下代码
array.map(&:to_i)
Run Code Online (Sandbox Code Playgroud)
好的,很容易看出这段代码的作用,但我想了解更多关于&:
我以前从未见过的构造.
不幸的是,我能想到的只是"lambda",而不是.谷歌告诉我Ruby中的lambda语法是->->(x,y){ x * y }
所以&:
除了调用单一方法之外,任何人都知道神秘是什么以及它能做什么?
我发现Ruby中的这段代码非常有趣
(1..4).inject(&:+)
Run Code Online (Sandbox Code Playgroud)
好的,我知道是什么inject
,我知道这段代码基本上相当于
(1..4).inject(0) {|a,n| a + n}
Run Code Online (Sandbox Code Playgroud)
但它究竟是如何运作的呢?
为什么&:+
和写块一样{|a,n| a + n}
?
为什么它不需要初始值?我很好,正常值为0,但(1..4).inject(&:*)
也有效,初始值必须为1 ...
可能重复:
map(&:name)在Ruby中意味着什么?
我正在看一个railscast并看到了这段代码.
[Category, Product].(&:delete_all)
Run Code Online (Sandbox Code Playgroud)
关于清理数据库.
我询问了IRC中的线路,并被告知
(&:delete_all)
Run Code Online (Sandbox Code Playgroud)
是一个捷径
{|model| model.delete_all}
Run Code Online (Sandbox Code Playgroud)
我用以下测试了这个
class ClassOne
def class_method
puts 1
end
end
class ClassTwo
def class_method
puts 2
end
end
[ClassOne, ClassTwo].each(&:class_method)
Run Code Online (Sandbox Code Playgroud)
我收到一个错误说
Wrong Argument type Symbol (expected Proc)
Run Code Online (Sandbox Code Playgroud)
我也试过了
one = ClassOne.new
two = ClassTwo.new
[one, two].each(&:class_method)
Run Code Online (Sandbox Code Playgroud)
但那仍然失败了.
如果我修改它来阅读
[one, two].each{|model| model.class_method}
Run Code Online (Sandbox Code Playgroud)
一切都按预期工作.
那么,&:delete_all
实际上做了什么?文档说这delete_all
是一种方法,所以我对这里发生的事情感到困惑.
为了更好地理解Ruby,我遇到了上网冲浪的代码:
require 'rubygems'
require 'activeresource'
ActiveResource::Base.logger = Logger.new("#{File.dirname(__FILE__)}/events.log")
class Event < ActiveResource::Base
self.site = "http://localhost:3000"
end
events = Event.find(:all)
puts events.map(&:name)
e = Event.find(1)
e.price = 20.00
e.save
e = Event.create(:name => "Shortest event evar!",
:starts_at => 1.second.ago,
:capacity => 25,
:price => 10.00)
e.destroy
Run Code Online (Sandbox Code Playgroud)
我特别感兴趣的是如何events.map(&:name)
工作?我看到事件是一个数组,因此它正在调用它的map方法.现在我的问题是,传递给地图的块在哪里创建?符号是什么:在这种情况下的名称?我试图了解它是如何工作的.
可能重复:
Ruby/Ruby on Rails&符号冒号
在Railscast#167中看到:
def tag_names
@tag_names || tags.map(&:name).join(' ')
end
Run Code Online (Sandbox Code Playgroud)
这是什么&:name
语法,它做什么?
我理解符号是什么,但是&
可以将其他类型的对象添加到其中?
重复问题:Ruby&符号冒号快捷方式
可能重复:
map(&:name)在Ruby中意味着什么?
有什么东西survey.map(&:questions).flatten.compact
叫做,所以我可以找到更多关于它们的信息:).这&:
解决了什么问题,或者它究竟做了什么?它是否用于其他语言?