为什么不>>在Ruby中添加字符串?

时间:2011-03-28 13:05:50

标签: ruby

在ruby中,您可以使用<<附加字符串:

>> "Hello" << "World"
=> "HelloWorld"

那么为什么不能使用>>进行前置?

>> "Hello" >> "World"
NoMethodError: undefined method `>>' for "Hello":String

我意识到String没有定义>>方法,但背后的原因是什么?

5 个答案:

答案 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] http://bugs.ruby-lang.org/issues/3675

[2] http://translate.google.com/translate?hl=en&sl=ja&tl=en&u=http%3A%2F%2Fbugs.ruby-lang.org%2Fissues%2F3675

答案 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,但没有预先添加参数字符串的方法。