2014-10-19 57 views
4

我碰到这行代码,无法理解点的用途。有人可以解释65 . + rand(10)中的点在做什么以及这与65 + rand(10)有什么不同?在这行代码中,点的含义是:65. + rand(10)

对于全方面,我看到这个代码,这8字符随机字符串发生器内:

(0...8).map{65.+(rand(25)).chr}.join => "QSILUSPP" 
(0...8).map{65.+(rand(25)).chr}.join => "BJIIBQEE" 
(0...8).map{65.+(rand(25)).chr}.join => "XORWVKDV" 
+2

如果你的问题是关于'65。+(...)'部分的具体问题,那么你应该删除其余部分,因为它会分散你的实际问题。 – meagar 2014-10-19 22:37:37

回答

2

您可以注意到,在原始代码中有2个方法调用 - +chr。我可以用等效代码展示它:

65.send(:+, rand(10)).send(:chr) # is the equal to following line: 
65.+(rand(10)).chr 

这个技巧会产生方法链,允许跳过圆括号。随着括号,65.+(rand(10)).chr可以这样写:

(65 + rand(10)).chr 

如果没有这一招,chr将适用于rand(10)和结果字符串将尝试添加到65.这将产生类型错误:

65+(rand(25)).chr 
TypeError: String can't be coerced into Fixnum 
+0

(1)'65. + (...)'不是一招,'67 + ...'是诀窍(语法糖)。 (2)你有什么没有大括号,他们是括号。 (3)你写了“... apply [on] rand(10)'...”,在这个例子中你有'rand(25.1)'。这是误导。 – sawa 2014-10-20 00:45:06

+0

当然,这不是一个窍门。但仍然是日常编程的不寻常举动。你需要明确地调用'。+'的理由。在这种情况下,作者将其用于方法链。而那种避免日常编程的做法就是我所说的“诡计”。 – 2014-10-20 06:06:41

1

它没有任何不同。由于数字是Ruby中的对象,因此+实际上是一个方法调用,因此可以像使用任何其他方法一样使用点语法。您习惯看到的表单65 + rand(10)是“语法糖”,相当于65.+(rand(10))

为什么有人会使用.+来编写代码,我不知道。

+0

对于它而言,这里是'+'的文档:http://www.ruby-doc.org/core-2.1.3/Fixnum.html#method-i-2B – 2014-10-19 22:37:08