我在读this.使用这个有什么好处:

user&.address&.state

结束

user.try(:address).try(:state)

我还是不明白.

推荐答案

(1) &. is generally shorter than try(...)

根据场景的不同,这可以使代码更具可读性.

(2) &. is standard Ruby, as opposed to try

方法try不是在Ruby核心库中定义的,而是在Rails库中定义的.当你不是在开发RoR web应用程序,而是在编写小助手脚本时,这会很快变得相关.

(3) &. makes debugging easier

如果调用了不存在的方法,安全遍历操作符将抛出错误.

>> "s"&.glubsch
NoMethodError: undefined method `glubsch' for "s":String

只有在nil岁时,它才会表现得宽大:

>> nil&.glubsch
=> nil

try方法将始终返回nil.

>> "s".try(:glubsch)
=> nil

请注意,最新版本的Ruby和Rails就是这样.

现在想象一个场景,其中存在一个名为glubsch的方法.然后决定重命名该方法,但忘记在一个地方重命名它.(遗憾的是,ruby可能会出现这种情况……)使用安全遍历操作符,您几乎会立即注意到错误(只要该行代码第一次执行).然而,try方法很乐意为您提供一个nil,并且您将在程序执行的下游某处得到一个与nil相关的错误.有时,弄清楚这样一个nil的来源可能很困难.

&.快速而艰难地失败比用try轻松地返回nil更容易调试.

EDIT: There is also the variant try! (with a bang) that behaves the same as &. in this regard. Use that if you don't like &..

(4) 如果我不在乎是否实现了一个方法呢?

那太奇怪了.由于这是一种意想不到的编程方式,请明确说明.例如,通过使用respond_to?充实两个 case (实施或未实施),并将其分支.

(5) What about try's block form?

块可以传递给try,而不是方法名.该块将在接收器的上下文中执行;在街区内,没有宽大处理.因此,只需一个方法调用,它的行为实际上与&.相同.

>> "s".try{ glubsch }
NameError: undefined local variable or method `glubsch' for "s":String

对于更复杂的计算,您可能更喜欢这种块形式,而不是引入大量局部变量.例如,一连串的

foo.try{ glubsch.blam }.try{ bar }.to_s

将允许foonil,但要求foo.glubsch返回非nil值.然后,您可以以更简洁的方式使用安全遍历操作符执行同样的操作:

foo&.glubsch.blam&.bar.to_s

然而,在复杂的计算中使用try的块形式是一种代码味道,因为它会妨碍可读性.当你需要实现复杂的逻辑时,可以引入带有描述性名称的局部变量,也可以使用if来区分nil的情况.您的代码将更易于维护.

嗯!

Ruby相关问答推荐

如何通过语法将Ruby Sorbet签名突出显示为不强调的 comments ?

运行跳过的RSpec测试,如果通过则失败

Ruby - 使用索引值识别和更新数组中的重复项

BasicObject 的 singleton_class 的超类如何以及为什么是 Ruby 中的 Class 类?

厨师从源代码安装和更新程序

将 pp 的结果(或输出到控制台的任何内容)放入字符串

将数组转换为哈希,其中键是索引

如何判断一个对象在 Ruby 中是否可迭代?

如何使用 Ruby 删除字符串中某个字符后的子字符串?

拆分 Ruby 字符串时如何保留分隔符?

从href html标签中提取带有Ruby中nokogiri的链接(URL)?

将一个目录的内容复制到另一个目录

如何将消息附加到 RSpec 判断?

警告! PATH 设置不正确,通常这是由 shell 初始化文件引起的

用元素填充数组 N 次

Ruby 中的文件打开模式

使用 Ruby 将大写字符串转换为标题大小写

map、each 和 collect 有什么区别?

判断整数是否在范围内

Rubocop 25 线块大小和 RSpec 测试