定义了 Ruby 的奇怪行为?
Odd behavior with Ruby defined?
我是 Ruby 的新手,对定义有疑问?关键字。
这是我编写的一段代码,用于加载 yaml 文件以初始化 Ruby 脚本中的设置:
# Read settings file
require 'YAML'
settingsFile = File.join(File.dirname(__FILE__), "settings.yml").tr('\', '/')
Settings = YAML.load_file(settingsFile) unless defined? Settings
puts Settings
yaml 文件如下所示:
Hello: World
正确输出:
{"Hello"=>"world"}
现在如果我使用变量而不是常量来存储设置,例如:
# Read settings file
require 'YAML'
settingsFile = File.join(File.dirname(__FILE__), "settings.yml").tr('\', '/')
settings = YAML.load_file(settingsFile) unless defined? settings
puts settings
设置returns空。
什么给?为什么使用常量会使这项工作有效?
这是 Ruby 处理尾随 if
/unless
条件以及变量如何产生并获得 "defined".
的一个怪癖
在第一种情况下,常量不是 "defined" 直到它被赋值。创建常量的唯一方法是:
CONSTANT = :value
变量的行为不同,有些人会争论得更多奇怪。如果它们在范围内的任何地方使用,即使在逻辑条件跳过的代码块中,它们也会存在。
对于您的表格行:
variable = :value unless defined?(variable)
variable
得到 "defined" 因为它存在于正在执行的行上,所以将有条件地分配给它。为此,它必须是局部变量。
如果你这样重做:
unless defined?(variable)
variable = :value
end
然后行为消失,赋值继续进行,因为在该行之前没有定义变量。
奇怪的是:
if defined?(variable)
variable = :value
end
现在显然它没有被定义,它没有被分配,但是后来发生了:
defined?(variable)
# => "local-variable"
现在无论如何都定义了它,因为 Ruby 确定它是一个变量。它还没有值,它是 nil
,但就 Ruby 而言它是 "defined"。
它变得更加陌生:
defined?(variable)
# => false
if (false)
variable = :value
end
defined?(variable)
# => "local-variable"
那段代码甚至 运行 都没有,它 不能 甚至 运行,但是,看,variable
现已定义。从该赋值行开始,就 Ruby 而言,变量 存在 。
由于您正在尝试赋值并且 defined?
在同一行上变量存在并且您的赋值不会发生。这就像一个小小的悖论。
我是 Ruby 的新手,对定义有疑问?关键字。
这是我编写的一段代码,用于加载 yaml 文件以初始化 Ruby 脚本中的设置:
# Read settings file
require 'YAML'
settingsFile = File.join(File.dirname(__FILE__), "settings.yml").tr('\', '/')
Settings = YAML.load_file(settingsFile) unless defined? Settings
puts Settings
yaml 文件如下所示:
Hello: World
正确输出:
{"Hello"=>"world"}
现在如果我使用变量而不是常量来存储设置,例如:
# Read settings file
require 'YAML'
settingsFile = File.join(File.dirname(__FILE__), "settings.yml").tr('\', '/')
settings = YAML.load_file(settingsFile) unless defined? settings
puts settings
设置returns空。
什么给?为什么使用常量会使这项工作有效?
这是 Ruby 处理尾随 if
/unless
条件以及变量如何产生并获得 "defined".
在第一种情况下,常量不是 "defined" 直到它被赋值。创建常量的唯一方法是:
CONSTANT = :value
变量的行为不同,有些人会争论得更多奇怪。如果它们在范围内的任何地方使用,即使在逻辑条件跳过的代码块中,它们也会存在。
对于您的表格行:
variable = :value unless defined?(variable)
variable
得到 "defined" 因为它存在于正在执行的行上,所以将有条件地分配给它。为此,它必须是局部变量。
如果你这样重做:
unless defined?(variable)
variable = :value
end
然后行为消失,赋值继续进行,因为在该行之前没有定义变量。
奇怪的是:
if defined?(variable)
variable = :value
end
现在显然它没有被定义,它没有被分配,但是后来发生了:
defined?(variable)
# => "local-variable"
现在无论如何都定义了它,因为 Ruby 确定它是一个变量。它还没有值,它是 nil
,但就 Ruby 而言它是 "defined"。
它变得更加陌生:
defined?(variable)
# => false
if (false)
variable = :value
end
defined?(variable)
# => "local-variable"
那段代码甚至 运行 都没有,它 不能 甚至 运行,但是,看,variable
现已定义。从该赋值行开始,就 Ruby 而言,变量 存在 。
由于您正在尝试赋值并且 defined?
在同一行上变量存在并且您的赋值不会发生。这就像一个小小的悖论。