在 Ruby 中,如何使用运算符将​​一个变量设置为等于其他两个变量之一,具体取决于哪个变量具有值?

Using operators, how to set a variable equal to one of two other variables depending on which one has a value, in Ruby?

当实例变量“a”只有两种状态时,要么有值,要么没有,当实例变量“b”只有一种可能状态时,它有值。如果“a”没有值,我可以通过以下方式将“a”设置为等于“b”:

@a = nil
@b = "world"

def set_a
    @a ||= @b
end

set_a

p @a
 => "world"
@a = "hello"
@b = "world"

def set_a
    @a ||= @b
end

set_a

p @a
 => "hello"

但是,如果要设置“a”的选项不止一个怎么办?例如,我想将实例变量“a”设置为“b”或“c”,具体取决于哪个具有值。在程序中,只有 "b" 或 "c" 有一个值,永远是一个,而不是两个。有没有办法,用运算符写出类似下面的东西:

if @a == nil
   if @b == nil
      @a = @c
   else
      @a = @b
   end
end

我试图写一些像这样的东西:

def set_a
    @a ||= (@b || @c)
end

但是,如果@a 有一个值,它将保留。这就是我想要的。但是,如果@a 为 nil,则它不会采用 @b 或 @c 的值,它将保持为 nil。

感谢您的宝贵时间。

你可以写

Module.const_defined?(:A) ? A : (B == true ? B : C)

获取A的值。

A not defined
B = true
Module.const_defined?(:A) ? A : (B == true ? B : C)
  #=> true
A not defined
B = false
Module.const_defined?(:A) ? A : (B == true ? B : C)
  #=> 42
A = "cat"
B = false
C = 42
Module.const_defined?(:A) ? A : (B == true ? B : C)
  #=> "cat"

Module#const_defined?

常量和局部变量如果未定义将引发 NameError。您可能想改用实例变量,因为它们在被引用时 auto-vivified 和 nil 一样,即使它们还没有被分配。例如:

@a ||= (@b || @c)
#=> nil

如果 @a@b 为真,那么事情可能会如您所愿。但是,如果所有三个变量都是假的,那么 @a 将被赋值 @c 即使 @c 计算为 nilfalse.