多方法调用

时间:2015-05-29 20:06:46

标签: ruby methods

这只会返回原始name

name = "George"
name.reverse.upcase!
puts(name)

我想知道为什么以及如果有办法做我上面尝试过的事情。

3 个答案:

答案 0 :(得分:3)

reverse返回一个新字符串。 upcase!升级就地调用它的字符串。您正在创建一个新的反向字符串,更新该字符串,然后再也不再使用它。

如果您想要反转并提升原始字符串,可以test = symbole(test);

答案 1 :(得分:2)

您调用的方法不会影响调用对象。 name.reverse将返回一个新的String并保留原始字符串。您要做的是在通话后重新分配姓名。

name = George
name = name.reverse.upcase

这里的爆炸方法有一个问题,以!结尾!通常会修改正在操作的对象。所以你可以做类似下面的事情:

name = George
name.reverse!.upcase!

一般来说,我会避免!方法,除非你有充分的理由。设置“name =”的第一个例子非常清晰,易于阅读和明确。

答案 2 :(得分:0)

也许这有助于解释发生的事情:

name = "George"  # => "George"
name.object_id   # => 70228500576040

object_id是实际变量的内存引用,换句话说,就是脚本运行时它的存在。

reversed_name = name.reverse  # => "egroeG"
reversed_name.object_id       # => 70228500574980

我们可以告诉reverse创建了一个新变量,因为object_idname不同。

upcased_reversed_name = reversed_name.upcase!  # => "EGROEG"
upcased_reversed_name.object_id                # => 70228500574980

upcase!方法修改了与reversed_name相同的变量。

如果我们改为使用upcaseobject_id会发生变化,因为会创建新版本的变量:

upcased_reversed_name = reversed_name.upcase  # => "EGROEG"
upcased_reversed_name.object_id               # => 70228500572960
upcased_reversed_name # => "EGROEG"

简短的一课是,您无法将!方法结果分配给变量,因为它会对原始变量起作用并对其进行更改。