在 Ruby 中使用安全导航

Nurudeen Ibrahim 2022年5月18日
在 Ruby 中使用安全导航

Ruby 安全导航运算符 (&.) 是在 Ruby 2.3.0 中引入的。它允许你安全地链接对象上的方法,基本上是为了避免流行的 nil:NilClass 的未定义方法错误。

本文将简要讨论如何在 Ruby 中使用安全导航。

在 Ruby 中使用安全导航来防止未定义的方法

示例代码:

class Bus
  def seats
    14
  end
end

class Vehicle
  def initialize(name)
    @name = name
  end

  def category
    Bus.new if @name == "hiace"
  end
end

vehicle = Vehicle.new("camry")
number_of_seats = vehicle.category.seats
puts number_of_seats

输出:

undefined method `seats' for nil:NilClass (NoMethodError)

如上例所示,vehicle.category.seats 爆炸并导致 undefined method 错误,因为 vehicle.category 已经返回 nil。为了避免这个问题,我们需要在链接另一个方法之前检查 vehicle.category 是否成功。

下一个示例,vehicle.category && vehicle.category.seats 表示如果 vehicle.category 成功,则应评估 vehicle.category.seats,否则应停止代码执行并返回 nil。这很好用,但可以用 Safe Navigation Operator 编写。

示例代码:

class Bus
  def seats
    14
  end
end

class Vehicle
  def initialize(name)
    @name = name
  end

  def category
    Bus.new if @name == "hiace"
  end
end

vehicle = Vehicle.new("camry")
number_of_seats = vehicle.category && vehicle.category.seats
puts number_of_seats

输出:

nil

在最后一个示例中,我们将使用另一个更易读、更简洁的安全导航版本。它在我们必须在一个对象上链接许多方法的情况下变得很有用,例如 object1&.method1&.method2&.method3&.method4

示例代码:

class Bus
  def seats
    14
  end
end

class Vehicle
  def initialize(name)
    @name = name
  end

  def category
    Bus.new if @name == "hiace"
  end
end

vehicle = Vehicle.new("camry")
number_of_seats = vehicle&.category&.seats
puts number_of_seats

输出:

nil