为什么';t>&燃气轮机;Ruby中的前置字符串?
在ruby中,您可以使用ruby always asigns值从右到左添加字符串 但是你可以自己实现它为什么';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”是“
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"