为什么';t>&燃气轮机;Ruby中的前置字符串?

为什么';t>&燃气轮机;Ruby中的前置字符串?,ruby,Ruby,在ruby中,您可以使用ruby always asigns值从右到左添加字符串 但是你可以自己实现它 class String def >>(s) s << self end end "Hello" >> "world" #=> "worldHello" 类字符串 def>>(s) s>“世界” #=>“世界你好” Ruby的语法不允许像>这样的方法以您期望的方式实现 “World”,这不是有效的Ruby语法 如果“World”是“

在ruby中,您可以使用ruby always asigns值从右到左添加字符串

但是你可以自己实现它

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

"Hello" >> "world"
#=> "worldHello"
类字符串
def>>(s)
s>“世界”
#=>“世界你好”

Ruby的语法不允许像
>
这样的方法以您期望的方式实现

>“World”
,这不是有效的Ruby语法


如果“World”是“Hello”的一个参数,那么您只需添加一个类似fl00r的字符串。别名
>
的意思相同,我认为这是一个好问题,而且这个问题比符号
的问题更普遍,我不认为我会这样做,但如果有人强迫我:

class String
  def prepend(string)
    insert(0, string)
  end
end
我不认为
>
是个好主意,因为
Ruby 1.9.3添加了一个字符串#prepend方法

关于添加prepend[1]的建议还包括“>>”方法,关于该实现[2]的线程也有一些讨论:

Matz说:“>>很有趣,但我没想到。”

sorya说:“这个补丁已经发布了,它已经向IRC讨论过好几次了。”

然而,在线程结束时,结论是接受String#prepend,并且“包括String#>>在内的其他建议正在等待。”

但是我找不到关于它的任何其他讨论。。。还有其他人吗

就我个人而言,我很喜欢它,补充一点也不重要:

类字符串
def>>(s)
s、 预结束(自我)
结束
结束
结果是:

[1]



[2]

这将是谁的方法
Hello
World
吗?我想不出任何理由不能这样做,但该方法的功能是否相同?你可能会认为它是前置的,但是ruby只看到2个字符串,并将等式右侧的字符串粘贴到左侧字符串的末尾。我会假设这样做是不常见的,而众所周知的
>
的含义是“右移位”,因此它避免了混淆;因为你自己写很容易。@Zabba-
@Mladen:应该是在Hello上。他说的是“prepend”,所以我假设预期的输出仍然是“HelloWorld”。@Michael-追加表示“HelloWorld”,所以我希望prepend表示“WorldHello”。这就是问题所在。Ruby方法改变参数而不是调用它的对象是不自然的。我想这就是
String#>
不存在的原因。:)@Mladen Jablanović,实际上我们可以返回
self=s+self
,所以参数不会发生太大的变化(因为
self
不能被赋值),但是可以执行
插入(0,s)
。但不管怎样,这种特殊的
>
是违反直觉的,因为每个人都期望
'Hello'>>'World'
会导致
'HelloWorld'
,不是吗?你为什么会期望这样?为什么不是“你好”>>(“世界”)?对我来说,使用像
这样的速记的部分目的是有意义的。我以前从未想到过,正如我对姆拉登所说的,这可能是因为这两种相互矛盾的解释才没有这样做。如果是
“你好”。>(“世界”)
,那么你所做的就是重新定义
(“世界”)
,这将产生“HelloWorld”,与
“你好”有任何不同.@Simon-抱歉,直到刚才才收到你的最新评论,希望我的新评论能帮助你了解更多。有一种方法可以在参数字符串前面加上前缀,它叫做
string\insert
。不,它不能这样做。你必须强制性地把
0
作为第一个参数,使它作为prepend工作。是的,我同意,但是说没有prepends方法仍然是错误的。插入前缀,它没有一个很好的快捷方式。原始问题的要点是,没有与
相反的对应项,正如Patrick Smith指出的,从1.9.3开始,确实有一个前缀方法。这与
prepend
的别名,那么它实际上应该将参数前置到对象。你最好只做
类字符串;别名:>>:
以字符串在源代码中出现的顺序加入。@coreyward,这不是真的。每个人都在使用字符串文字,这一点变得有些模糊。如果您将>>别名为@AnthonyDeSimone,我认为您的评论可能会更清楚,但关于字符串文本与变量的观点是正确的。尽管如此,我还是怀疑我们是否会在Ruby/ActiveSupport中看到这种情况,因为它违背了您所期望的情况,而这种情况仅仅是为了激起一种非常人性化的渴望,希望事情能够平衡(也就是说,想要一个
>
来补充我们的
@coreyward,你是对的。我想指出的是,在一种情况下,我们永久性地修改a,而在另一种情况下,我们永久性地修改b。)。
class String
  def >>(s)
    s << self
  end
end

"Hello" >> "world"
#=> "worldHello"
class String
  def prepend(string)
    insert(0, string)
  end
end
>> "Hello" >> "World"
=> "HelloWorld"