在ruby中,您可以使用<<
附加字符串:
>> "Hello" << "World"
=> "HelloWorld"
那么为什么不能使用>>
进行前置?
>> "Hello" >> "World"
NoMethodError: undefined method `>>' for "Hello":String
我意识到String
没有定义>>
方法,但背后的原因是什么?
答案 0 :(得分:24)
Ruby 1.9.3添加了一个String #prepend方法。
关于添加前置[1]的提案还包括“&gt;&gt;”方法,关于该实现的线程有一些讨论[2]:
Matz说:“&gt;&gt;是有趣的符号,没有想到它。”
索里亚说:“这个补丁已经出来,已经多次向IRC讨论了”
然而,在该主题的最后,结论是接受字符串#prepend,并且“包括字符串#&gt;&gt;在内的其他提案正在等待。”
我找不到任何关于它的其他讨论......其他人?
就个人而言,我喜欢它,并且添加:
是微不足道的class String
def >> (s)
s.prepend(self)
end
end
结果:
>> "Hello" >> "World"
=> "HelloWorld"
答案 1 :(得分:19)
Ruby的语法不允许以您期望的方式实现>>
之类的方法。
<<
中的 "Hello" << "World"
等同于以下内容:
"Hello".<<("World")
如果你想创建一个prepend方法>>
,我希望"Hello" >> "World"
中的“Hello”成为字符串"World"
的参数:
("Hello")>>."World"
这不是有效的Ruby语法。
如果“World”是“Hello”的参数,那么你只需要附加一个像fl00r所示的字符串。将>>
别名与<<
相同会导致混淆。
这就是您使用insert
方法的原因。如果你想在“世界”前插入“Hello”,你可以在“World”上调用insert:
"World".insert(0, "Hello ")
这里需要注意的是<<
是一个方法调用就像一个字符串方法,如length
,所以你必须保持排序类似于常规方法调用。
答案 2 :(得分:6)
Ruby始终从右到左分配值。
但你可以自己实施
class String
def >>(s)
s << self
end
end
"Hello" >> "world"
#=> "worldHello"
答案 3 :(得分:1)
我认为我不会这样做,但如果有人强迫我这样做:
class String
def prepend(string)
insert(0, string)
end
end
我认为>>
不是一个好主意 - <<
很好的原因是因为它看起来会发生什么。 >>
看起来与我<<
的结果相同,只是调用对象被预先添加到参数上。
答案 4 :(得分:0)
我认为这是一个很好的问题,而且问题比McStretch的回答中提到的符号<<
的问题更为普遍,因为字母表中给出的方法存在相同的情况。也就是说,有String#concat
,其中将参数字符串附加到self
,但没有预先添加参数字符串的方法。