块[self]与三元运算符的奇怪行为

时间:2014-04-17 07:55:12

标签: ruby block ternary-operator

我正在使用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]

有人可以解释一下为什么“---”以上的结果与“---”以下的结果不同?

1 个答案:

答案 0 :(得分:1)

它与三元运算符无关。该商品为0,小于1,因此您需要比较instance_eval(&block)(苹果)和block[self](橙子)。如果你做了

,你会得到相同的结果
def self.generate(filename, &block)
  instance_eval(&block)
  p '---'
  block[self]
end

差异很容易理解:前者的评估是selfPrawn::Document类对象,后者selfA的实例