我正在使用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]
有人可以解释一下为什么“---”以上的结果与“---”以下的结果不同?
答案 0 :(得分:1)
它与三元运算符无关。该商品为0
,小于1
,因此您需要比较instance_eval(&block)
(苹果)和block[self]
(橙子)。如果你做了
def self.generate(filename, &block)
instance_eval(&block)
p '---'
block[self]
end
差异很容易理解:前者的评估是self
是Prawn::Document
类对象,后者self
是A
的实例