这只会返回原始name
。
name = "George"
name.reverse.upcase!
puts(name)
我想知道为什么以及如果有办法做我上面尝试过的事情。
答案 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_id
与name
不同。
upcased_reversed_name = reversed_name.upcase! # => "EGROEG"
upcased_reversed_name.object_id # => 70228500574980
upcase!
方法修改了与reversed_name
相同的变量。
如果我们改为使用upcase
,object_id
会发生变化,因为会创建新版本的变量:
upcased_reversed_name = reversed_name.upcase # => "EGROEG"
upcased_reversed_name.object_id # => 70228500572960
upcased_reversed_name # => "EGROEG"
简短的一课是,您无法将!
方法结果分配给变量,因为它会对原始变量起作用并对其进行更改。