我偶然发现了这行ruby代码。什么&。这是什么意思?

@object&.method

当前回答

安全导航操作符(&.):告诉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

一些合法的用例:安全导航操作符在处理多个对象时很方便,如这里所示,以及在将方法链接在一起时。

其他回答

对于所有学过Typescript的人来说,它和?操作符

object&。An_attribute在ruby on rails?

我是Ruby on rails的新手,我看到了这种代码,但我不理解它:

在Ruby中,像大多数主流编程语言一样,用户代码不能修改编程语言的基本工作方式,也不能改变编程语言的语法。

因为Ruby on Rails只是Ruby代码,所以很明显这与Ruby on Rails没有任何关系。

因此,我们需要从Ruby中寻找解释,而不是Ruby on Rails。

安全导航操作符或安全导航器在language/safe_navigator_spec中指定。ruby/spec的Rb,特别是这里:

Context“当Context为nil时”做 它“总是返回nil” eval(“nil&.unknown”)。应该== nil eval(“[][10]&.unknown”)。应该== nil 结束 它“可以被拴住” eval(“nil&.one&.two&.three”)。应该== nil 结束 它“不评估论点” obj = Object.new obj.should_not_receive(米): Eval ("nil&.unknown(obj.m) {obj. xml ")m}”) 结束 结束

它被记录在Ruby语法文档的调用方法部分:

&。,称为“安全导航操作符”,允许在接收器为nil时跳过方法调用。如果跳过调用,它将返回nil并且不计算方法的参数。

安全导航操作符(&.):告诉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

一些合法的用例:安全导航操作符在处理多个对象时很方便,如这里所示,以及在将方法链接在一起时。

它用于nil检查,如在kotlin和swift中 例如; 与对象-> Swift和Kotlin

model = car?.model

如果我们没有在car类中定义模型值,这个模型可以是nil(Swift)或null(Kotlin)。 在ruby中,我们使用&号而不是问号

model = car&.model

如果使用汽车。模型没有&号,如果模型为空,系统不能继续运行。

它被称为安全导航操作员。在Ruby 2.3.0中引入,它让你可以在对象上调用方法,而不用担心对象可能是nil(避免nil的未定义方法:NilClass错误),类似于Rails中的try方法。

所以你可以写

@person&.spouse&.name

而不是

@person.spouse.name if @person && @person.spouse

来自文档:

my_object.my_method 这将my_method消息发送给my_object。任何 对象可以是接收器,但这取决于方法的可见性 发送消息可能会引发NoMethodError。 你可以使用&。要指定一个接收者,则不调用my_method 当接收器为nil时,结果为nil。在这种情况下, my_method的参数不计算。