【问题标题】:what's the difference between calling method on @some and some [closed]@some 和 some 上的调用方法有什么区别 [关闭]
【发布时间】:2021-12-31 20:23:45
【问题描述】:

为什么我在 e 上调用 eval_prog 时返回错误,但它在 @e

上正常工作
class Let < GeometryExpression
  def initialize(s,e1,e2)
    @s = s
    @e1 = e1
    @e2 = e2
  end

  def preprocess_prog
    Let.new(@s, @e1.preprocess_prog, @e2.preprocess_prog)
  end  

  def eval_prog env
    @e2.eval_prog([@s, @e1.eval_prog(env)] + env)
  end
end

【问题讨论】:

标签: ruby class oop methods


【解决方案1】:

想必你说的是@e1@e2这个方法:

def eval_prog env
  @e2.eval_prog([@s, @e1.eval_prog(env)] + env)
end

您从e1.eval_prog(env) 收到错误,因为该范围内没有e1 局部变量,也没有e1 实例方法。 @e1.eval_prog(env) 有效,因为您确实有一个 @e1 实例变量。

如果你的班级看起来像这样:

class Let < GeometryExpression
  attr_accessor :e1, :e2, :s
  #...
end

然后attr_accessor 会给你e1e2 方法(以及e1=e2= 方法)然后你可以说:

def eval_prog env
  e2.eval_prog([s, e1.eval_prog(env)] + env)
end

您可能想改用attr_reader,这样您就不会得到mutator 方法。或者可能只是坚持使用实例变量来保持类的接口更小。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多