Ruby初学者需要一只手

V.A*_*waj 0 ruby

我是红宝石的初学者.
我试图运行此代码,它显示运行时错误.
这段代码出了什么问题?

class Calc
  attr_accessor :val1, :val2
  def initialize (val1,val2)
    @val1=val1
    @val2=val2
  end
end
a=Calc.new(2,3)
a.add_two_numbers(3)

def add_two_numbers(v3)
  return @val1+@val2+v3
end
Run Code Online (Sandbox Code Playgroud)

Kar*_*k T 5

该方法add_two_numbers没有在类上定义Calc,但是您正在使用它,就像它一样.这就是问题.

我猜你有一个NoMethodError.

更新:正如评论中所指出的,在实际中,该方法Object默认在类上定义,然后自动继承到所有类,但作为私有.这实际上意味着您将收到错误,指出正在调用私有方法.修复程序保持不变,因为总体问题是如何定义类及其方法的混淆.

修复方法是通过将类放在类主体中来定义类的方法.

class Calc
  attr_accessor :val1, :val2
  def initialize (val1,val2)
    @val1=val1
    @val2=val2
  end

  def add_two_numbers(v3)
    return @val1+@val2+v3
  end
end
Run Code Online (Sandbox Code Playgroud)

  • 在顶层定义的方法成为`Object`的私有实例方法.因此,实际上*通过从超类"Object"继承它来为`Calc`定义*,但它是私有的,不能使用显式接收器调用ergo.您的解决方案是正确的,但解释不完整. (5认同)