【问题标题】:Strange behavior of block[self] with ternary operator使用三元运算符的块 [self] 的奇怪行为
【发布时间】:2014-06-01 09:32:48
【问题描述】:

我正在使用 Ruby 2.1.1,并且遇到了三元运算符内部 ruby​​ 块的奇怪行为。请考虑以下程序:

module Prawn 
  class Document
    def self.generate(filename, &block)
      block.arity < 1 ? instance_eval(&block) : block[self] 
      p '---'
      block[self]
    end
  end
end

class A
  def initialize
    @a = 1
  end

  def foo
    qwe = 1
    Prawn::Document.generate("foobar") do 
      p @a
      p qwe
      p instance_variables  
    end
  end
end

A.new.foo

让我困惑的是这个程序的输出:

nil
1
[]
"---"
1
1
[:@a]

谁能解释一下为什么“---”上面的结果与“---”下面的结果不同?

【问题讨论】:

    标签: ruby block ternary-operator


    【解决方案1】:

    它与三元运算符无关。元数是0,小于1,所以您要比较instance_eval(&amp;block)(苹果)和block[self](橙子)。如果你这样做,你会得到相同的结果

    def self.generate(filename, &block)
      instance_eval(&block)
      p '---'
      block[self]
    end
    

    而且区别很容易理解:前者是用self 评估为Prawn::Document 类对象,而在后者中,selfA 的一个实例。

    【讨论】:

      猜你喜欢
      • 2013-10-29
      • 2016-07-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-20
      • 1970-01-01
      相关资源
      最近更新 更多