我偶然发现了这行ruby代码。什么&。这是什么意思?
@object&.method
我偶然发现了这行ruby代码。什么&。这是什么意思?
@object&.method
当前回答
小心!虽然安全导航操作符很方便,但也很容易欺骗自己用它改变逻辑。我建议避免在流量控制中使用它。例子:
str = nil
puts "Hello" if str.nil? || str.empty?
# The above line is different than the below line
puts "Hello" if str&.empty?
在第一个例子中,str.nil?返回true和str.empty?从未调用,导致执行puts语句。然而,在第二个例子中,str&.empty?返回nil,这是假的,并且puts语句永远不会执行。
其他回答
安全导航操作符(&.):告诉Ruby只在接收器不是nil时调用下一个方法。否则,表达式返回nil。
实际行动
让我们为一个运动队构造一个花名册对象。花名册将包含多个Player对象。
class Roster
attr_accessor :players
end
class Player
attr_accessor :name, :position
def initialize(name, position)
@name = name
@position = position
end
end
有了这两个对象,我们可以创建一个2对2女子篮球锦标赛的花名册:
moore = Player.new("Maya Moore", "Forward")
taurasi = Player.new("Diana Taurasi", "Guard")
tourney_roster1 = Roster.new
tourney_roster1.players = [moore, taurasi]
如果我们想知道2对2球队的前锋,我们可能会发现这个名字是这样的:
if tourney_roster1.players.first.position == "Forward"
puts "Forward: #{tourney_roster1.players.first.name}"
end
但如果我们的对手阵容设置不正确呢?
tourney_roster2 = Roster.new
if tourney_roster2.players.first.position == "Forward"
puts "Forward: #{tourney_roster1.players.first.name}"
end
Tourney_roster2尚未与任何球员设置。前面的代码将引发一个NoMethodError,因为tourney_roster2。Players返回nil。我们可以添加条件语句来避免这种情况,但这会使if语句冗长且不清楚:
if tourney_roster2.players &&
tourney_roster2.players.first &&
tourney_roster2.players.first.position == "Forward"
相反,我们可以使用安全导航操作符来避免NoMethodError:
if tourney_roster2.players&.first&.position == "Forward"
puts "Forward: #{tourney_roster1.players.first.name}"
end
因此,
>> tourney_roster2.players&.first == nil
#=> true
>> tourney_roster2.players&.first&.position == nil
#=> true
一些合法的用例:安全导航操作符在处理多个对象时很方便,如这里所示,以及在将方法链接在一起时。
这是我在这上面找到的一篇短文(3分钟)——非常不错。
为了补充上面的内容,它的作用类似于try!方法,而不是try方法。
因为它会引发一个NoMethodError异常如果接收者不是nil并且没有实现尝试的方法。
摘自上述文章的例子:
account = Account.new(owner: Object.new)
account&.owner&.address
# => NoMethodError: undefined method `address' for #<Object:0x00559996b5bde8>`
account.try(:owner).try(:address)
# => nil
account.try!(:owner).try!(:address)
# => NoMethodError: undefined method `address' for #<Object:0x00559996b5bde8>`
它用于nil检查,如在kotlin和swift中 例如; 与对象-> Swift和Kotlin
model = car?.model
如果我们没有在car类中定义模型值,这个模型可以是nil(Swift)或null(Kotlin)。 在ruby中,我们使用&号而不是问号
model = car&.model
如果使用汽车。模型没有&号,如果模型为空,系统不能继续运行。
对于所有学过Typescript的人来说,它和?操作符
小心!虽然安全导航操作符很方便,但也很容易欺骗自己用它改变逻辑。我建议避免在流量控制中使用它。例子:
str = nil
puts "Hello" if str.nil? || str.empty?
# The above line is different than the below line
puts "Hello" if str&.empty?
在第一个例子中,str.nil?返回true和str.empty?从未调用,导致执行puts语句。然而,在第二个例子中,str&.empty?返回nil,这是假的,并且puts语句永远不会执行。