【问题标题】:Ruby's "foo = true if !defined? foo" won't work as expectedRuby 的 "foo = true if !defined?foo" 不会按预期工作
【发布时间】:2010-09-23 04:10:30
【问题描述】:

当它实际上没有被定义时,它得到值nil 只是因为它被“触摸”了:

$ irb

ruby-1.9.2-p0 > foo = true if !defined? foo
 => nil 
ruby-1.9.2-p0 > foo
 => nil 

ruby-1.9.2-p0 > if !defined? bar
ruby-1.9.2-p0 ?>  bar = true
ruby-1.9.2-p0 ?>  end
 => true 
ruby-1.9.2-p0 > bar
 => true 

所以if ... end 按预期工作,但foo = true if ... 没有。

【问题讨论】:

  • 这是因为 foo 是在您调用 defined? 时定义的。我不明白这是出乎意料的
  • NullUserException: 所以它不先做'if'检查?很有趣。

标签: ruby


【解决方案1】:

Ruby 在执行包含赋值的行之前定义了一个局部变量,因此对于单行,defined?(foo) 将始终为 true

另一个例子表明局部变量是在行的任何部分执行之前定义的:

defined? foo # => false
foo = foo    # => foo is now nil

【讨论】:

    【解决方案2】:

    这听起来很合理 [语句] if [表达式]

    只是被编译器重新排列为

    如果 [表达式] 那么 [陈述] 结束

    但它看起来像是以定义中断的方式进行了特殊处理?实际上,defined 看起来像一个特殊的构造(即不是普通函数)

    看起来如果您在同一行中分配它,您应该检查 .nil?而是:

    foo = foo.nil? ?真的:foo

    (如果它已经设置为 false,这也有效)

    【讨论】:

      【解决方案3】:

      思考这个问题的方法是:

      foo = (true if !defined? foo)
      

      因此,首先定义 foo,然后运行为其赋值的表达式。

      【讨论】:

      • 这是“以这种方式思考”,而不是它实际上是这样执行的?
      猜你喜欢
      • 2011-04-16
      • 1970-01-01
      • 1970-01-01
      • 2016-03-11
      • 2019-12-29
      • 1970-01-01
      • 2022-09-04
      • 1970-01-01
      • 2015-07-07
      相关资源
      最近更新 更多