从Ruby on Rails打印输出

nvbavucw  于 2022-11-29  发布在  Ruby
关注(0)|答案(4)|浏览(282)
address = [1,2,3]
p address
new_address = address.reverse!
p new_address
p address.reverse!

印刷品:

[1,2,3]
[3,2,1]
[1,2,3]

我不明白为什么最后打印出来的是1,2,3如果是要反打印地址的话,地址是1,2,3
我期望最后一行是[3,2,1]。

2wnc66cl

2wnc66cl1#

在ruby中,当你在方法调用的末尾有一个!时,这意味着它也改变了接收者。
因此,new_address = address.reverse!不仅将还原后的值赋给new_address,还将其赋给address
我更新了您的代码,使其更明显:

address = [1,2,3]
p address
new_address = address.reverse! # [3,2,1]

p address # [3,2,1]
p new_address # [3,2,1]

p address.reverse! # [1,2,3]

您要使用的是相同的方法,但不使用!

address = [1,2,3]
p address
new_address = address.reverse
p new_address
p address.reverse

更多信息:http://ruby-for-beginners.rubymonstas.org/objects/bangs.html

ui7jx7zq

ui7jx7zq2#

这一切都是关于 Ruby 的bang (!)

address = [1,2,3]
p address
#> [1,2,4]

address.reverse
p address
#> [1,2,3]

address.reverse!
p address
#> [3,2,1]

感叹号表示您正在代码中进行永久保存的更改。
更多示例:

#without Bang (!).
name = "Ruby Monstas"
puts name.downcase
#> ruby monstas

puts name 
#> Ruby Monstas

# With Bang(!) Operator
name = "Ruby Monstas"
puts name.downcase!
#> ruby monstas

puts name
#> ruby monstas
44u64gxh

44u64gxh3#

要理解为什么会出现这种情况,您需要了解!的含义:
它表明reverse!reverse更危险,遵循的原则是最不意外开发人员可以将语法中的这种感觉传递给使用它的人。这里最大的区别是reverse!将更改对象本身,而reverse不会。https://www.ruby-forum.com/t/conventions-in-ruby-and-the-principle-of-least-surprise/158706/2
所以地址是:

address = [1,2,3]

当您调用此函数时:

new_address = address.reverse! # Address is [3,2,1]

最后:

p address.reverse! # address is [1, 2, 3]

这里的基础是理解!总是修改对象本身。

7kqas0il

7kqas0il4#

各种bang方法(在方法名末尾有一个感叹号的方法)修改对象in place。下面是你在代码中实际做的事情:

address = [1,2,3]

第一行将address变量定义为[1, 2, 3]

p address

第二行输出address变量(仍为[1, 2, 3]

new_address = address.reverse!

这第三行定义了您的new_address变量并且修改了原始的address变量。此时,**new_addressaddress都被定义为[3, 2, 1]

p new_address

第四行代码只是打印new_address变量,当然是[3, 2, 1]

p address.reverse!

还记得我们在第三行修改了原来的address变量吗?第五行代码只是将之前修改过的变量反向打印,因此[3, 2, 1]再次变为[1, 2, 3]。不仅如此,但是您再次使用bang版本的reverse方法修改了原始变量。如果此时您要尝试再次打印new_address变量,您猜怎么着...

p new_address
#=>  [1, 2, 3]

在本例中,我不确定您为什么要使用reverse!方法。基于您的困惑,我怀疑您应该只是使用reverse

相关问题