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]。
2wnc66cl1#
在ruby中,当你在方法调用的末尾有一个!时,这意味着它也改变了接收者。因此,new_address = address.reverse!不仅将还原后的值赋给new_address,还将其赋给address。我更新了您的代码,使其更明显:
!
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
ui7jx7zq2#
这一切都是关于 Ruby 的bang (!)。
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
44u64gxh3#
要理解为什么会出现这种情况,您需要了解!的含义:它表明reverse!比reverse更危险,遵循的原则是最不意外开发人员可以将语法中的这种感觉传递给使用它的人。这里最大的区别是reverse!将更改对象本身,而reverse不会。https://www.ruby-forum.com/t/conventions-in-ruby-and-the-principle-of-least-surprise/158706/2所以地址是:
reverse!
reverse
address = [1,2,3]
当您调用此函数时:
new_address = address.reverse! # Address is [3,2,1]
最后:
p address.reverse! # address is [1, 2, 3]
这里的基础是理解!总是修改对象本身。
7kqas0il4#
各种bang方法(在方法名末尾有一个感叹号的方法)修改对象in place。下面是你在代码中实际做的事情:
第一行将address变量定义为[1, 2, 3]
[1, 2, 3]
p address
第二行输出address变量(仍为[1, 2, 3])
这第三行定义了您的new_address变量并且修改了原始的address变量。此时,**new_address和address都被定义为[3, 2, 1]
[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。
4条答案
按热度按时间2wnc66cl1#
在ruby中,当你在方法调用的末尾有一个
!
时,这意味着它也改变了接收者。因此,
new_address = address.reverse!
不仅将还原后的值赋给new_address
,还将其赋给address
。我更新了您的代码,使其更明显:
您要使用的是相同的方法,但不使用
!
更多信息:http://ruby-for-beginners.rubymonstas.org/objects/bangs.html
ui7jx7zq2#
这一切都是关于 Ruby 的
bang (!)
。感叹号表示您正在代码中进行永久保存的更改。
更多示例:
44u64gxh3#
要理解为什么会出现这种情况,您需要了解
!
的含义:它表明
reverse!
比reverse
更危险,遵循的原则是最不意外开发人员可以将语法中的这种感觉传递给使用它的人。这里最大的区别是reverse!
将更改对象本身,而reverse
不会。https://www.ruby-forum.com/t/conventions-in-ruby-and-the-principle-of-least-surprise/158706/2所以地址是:
当您调用此函数时:
最后:
这里的基础是理解
!
总是修改对象本身。7kqas0il4#
各种bang方法(在方法名末尾有一个感叹号的方法)修改对象in place。下面是你在代码中实际做的事情:
第一行将
address
变量定义为[1, 2, 3]
第二行输出
address
变量(仍为[1, 2, 3]
)这第三行定义了您的
new_address
变量并且修改了原始的address
变量。此时,**new_address
和address
都被定义为[3, 2, 1]
第四行代码只是打印
new_address
变量,当然是[3, 2, 1]
还记得我们在第三行修改了原来的
address
变量吗?第五行代码只是将之前修改过的变量反向打印,因此[3, 2, 1]
再次变为[1, 2, 3]
。不仅如此,但是您再次使用bang版本的reverse
方法修改了原始变量。如果此时您要尝试再次打印new_address
变量,您猜怎么着...在本例中,我不确定您为什么要使用
reverse!
方法。基于您的困惑,我怀疑您应该只是使用reverse
。