我学习轨和下这个线程 。 我坚持的to_proc
方法。 我认为唯一的符号作为替代字符串(它们像琴弦,但更便宜的在内存方面)。 如果有别的我失踪了符号,那么请告诉我。 请简单的方式解释什么to_proc
手段,它是干什么用的。
Answer 1:
有些方法需要一个块,并且这种模式经常出现的块:
{|x| x.foo}
人们会喜欢写在一个更简洁的方式。 为了做到这一点,一个符号,该方法Symbol#to_proc
,隐式类铸造,并&
操作者组合使用。 如果你把&
在前面Proc
在参数位置的实例,将被解释为一个块。 如果你把其他的东西比Proc
与实例&
,那么隐含的类铸件将试图将其转换为Proc
使用实例to_proc
对该对象的定义方法,如果有的话。 在的情况下Symbol
实例, to_proc
的工作过程是这样:
:foo.to_proc # => ->x{x.foo}
例如,假设您这样写:
bar(&:foo)
的&
操作者与组合:foo
,这不是一个Proc
实例,因此隐式类转换应用于Symbol#to_proc
到它,这给->x{x.foo}
在&
现在适用于这一点,并解释为一个块,这给:
bar{|x| x.foo}
Answer 2:
解释最简单的方法是用一些例子。
(1..3).collect(&:to_s) #=> ["1", "2", "3"]
是相同的:
(1..3).collect {|num| num.to_s} #=> ["1", "2", "3"]
和
[1,2,3].collect(&:succ) #=> [2, 3, 4]
是相同的:
[1,2,3].collect {|num| num.succ} #=> [2, 3, 4]
to_proc返回一个Proc对象,它响应由符号给定的方法。 因此,在第三种情况下,在阵列[1,2,3]调用它的收集方法和。 SUCC是由类Array定义的方法。 所以这个参数是说收集每个元素的数组中,并返回其继任者,并从创建一个新的阵列导致[2,3,4]的手短方式。 符号:SUCC被转换到一个Proc对象,以便它调用Array的SUCC方法。
Answer 3:
对我来说,最明显的解释是看到一个简单的实现它。 下面是它可能看起来像如果我重新实现符号#to_proc:
class Symbol # reopen Symbol class to reimplement to_proc method
def to_proc
->(object) { object.send(self) }
end
end
my_lambda = :to_s.to_proc
puts my_lambda.(1) # prints '1'; .() does the same thing as .call()
puts my_lambda.(1).class # prints 'String'
puts [4,5,6].map(&:to_s) # prints "4\n5\n6\n"
puts [4,5,6].map(&:to_s).first.class # prints 'String'
Answer 4:
对于任何人还是有点难倒,运行下面的代码可能会使事情更清晰一点:
class Symbol
def to_proc
proc do |obj|
puts "Symbol proc: #{obj}.send(:#{self})"
obj.send(self)
end
end
end
class Array
def map(&block)
copy = self.class.new
self.each do |index|
puts "Array.map: copy << block.call(#{index})"
copy << block.call(index)
end
copy
end
end
remapped_array = [0, 1, 2].map &:to_s
puts "remapped array: #{remapped_array.inspect}"
这些都不是实际实现Symbol.to_proc
或Array.map
,他们是我用来演示如何刚刚精简版本map &:to_s
和类似电话的工作。
文章来源: What does to_proc method mean?