在 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"
常量和局部变量如果未定义将引发 NameError。您可能想改用实例变量,因为它们在被引用时 auto-vivified 和 nil
一样,即使它们还没有被分配。例如:
@a ||= (@b || @c)
#=> nil
如果 @a 或 @b 为真,那么事情可能会如您所愿。但是,如果所有三个变量都是假的,那么 @a 将被赋值 @c 即使 @c 计算为 nil
或 false
.
当实例变量“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"
常量和局部变量如果未定义将引发 NameError。您可能想改用实例变量,因为它们在被引用时 auto-vivified 和 nil
一样,即使它们还没有被分配。例如:
@a ||= (@b || @c)
#=> nil
如果 @a 或 @b 为真,那么事情可能会如您所愿。但是,如果所有三个变量都是假的,那么 @a 将被赋值 @c 即使 @c 计算为 nil
或 false
.