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

Sim*_*mon 18 ruby

在ruby中,您可以使用<<以下方法追加字符串:

>> "Hello" << "World"
=> "HelloWorld"
Run Code Online (Sandbox Code Playgroud)

那么为什么你不能使用它们>>

>> "Hello" >> "World"
NoMethodError: undefined method `>>' for "Hello":String
Run Code Online (Sandbox Code Playgroud)

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

Pat*_*ith 24

Ruby 1.9.3添加了一个String #prepend方法.

关于添加prepend [1]的提议还包括">>"方法,并且关于该实现的线程有一些讨论[2]:

马茨说:">>是有趣的符号没有考虑它."

索里亚说:"这个补丁已经出来,已经多次讨论过IRC"

但是在线程结束时,结论是接受String #prepend,并且"包括String#>>在内的其他提议正在等待."

我找不到任何关于它的其他讨论......还有其他人吗?

就个人而言,我喜欢它,添加以下内容是微不足道的:

class String
  def >> (s)
    s.prepend(self)
  end
end
Run Code Online (Sandbox Code Playgroud)

结果:

>> "Hello" >> "World"
=> "HelloWorld"
Run Code Online (Sandbox Code Playgroud)

[1] http://bugs.ruby-lang.org/issues/3675

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

  • 这与"<<"完全相同,只是它不是原生优化的.如果你说`>>`是`prepend`的别名,它实际上应该将参数添加到对象之前.你最好只做`class String; 别名:>>:<<; 如果您真正想要的是`:>>`以字符串出现在源中的顺序加入,那么结束`而不是使用本地`prepend`方法. (2认同)

McS*_*tch 19

Ruby的语法不允许像>>你期望的那样实现一个方法.

<<in "Hello" << "World"相当于以下内容:

"Hello".<<("World")

如果你想创建一个prepend方法>>,我希望"Hello" "Hello" >> "World"成为字符串的参数"World":

("Hello")>>."World" 这不是有效的Ruby语法.

如果"World"是"Hello"的参数,那么你只需附加一个像fl00r所示的字符串.别名>>意思相同<<会引起混淆.

这就是为什么你有这个insert方法.如果你想在"World"前插入"Hello",你可以在"World"上调用insert:

"World".insert(0, "Hello ")

这里需要注意的<<是,方法调用就像字符串方法一样length,所以你必须保持类似于常规方法调用的顺序.

  • 你为什么期待呢?为什么不是"你好".>>("世界")? (5认同)
  • 对我来说,使用像```这样的简写的部分目的是表示字符串被"推"到另一个字符串上.实际上它是一个箭头,说"这个字符串被添加到另一个字符串".如果你从这个角度思考它,使用`>>`会将'add"Hello"读成"World".那么说"世界"是你要添加"Hello"的对象是有意义的,现在语法上没有意义(运算符左边的参数). (4认同)

fl0*_*00r 6

Ruby始终从右到左赋值.

但是你可以自己实现它

class String
  def >>(s)
    s << self
  end
end

"Hello" >> "world"
#=> "worldHello"
Run Code Online (Sandbox Code Playgroud)

  • 嗯,这就是问题所在.Ruby方法改变一个参数而不是调用它的对象是不自然的.我猜这就是`String#>>`不存在的原因.:) (6认同)
  • 他说"前置",所以我认为预期的输出仍然是"HelloWorld". (3认同)
  • @Michael - 追加给出了"HelloWorld",所以我期待预先给予"WorldHello" (2认同)