我正在学习来自java的ruby dev,我不明白为什么我会遇到错误。 @test是一个类变量,所以我应该能够输出它吗?
C:/Projects/RubyPlayground/Tester.rb:6:in `test': wrong number of arguments (ArgumentError)
from C:/Projects/RubyPlayground/Tester.rb:6:in `testMethod'
from C:/Projects/RubyPlayground/Tester.rb:10
源:
class Tester
@test = "here"
def testMethod()
puts test
end
s = Tester.new()
s.testMethod()
end
答案 0 :(得分:5)
在这种情况下,@ test成为类实例变量,并与类对象(不是类实例!)相关联。如果你想@test的行为像java字段,你必须使用'initialize'方法:
class Tester
def initialize
@test = "here"
end
def testMethod
puts @test
end
end
s = Tester.new()
s.testMethod
答案 1 :(得分:3)
您正在呼叫Kernel#test
test(int_cmd, file1 [, file2] ) → obj
Uses the integer <i>aCmd</i> to perform various tests on <i>file1</i>
(first table below) or on <i>file1</i> and <i>file2</i> (second table).
我很惊讶这种方法存在。我在irb中使用self.method(:test)
找到了它的定义,感谢问题How to find where a method is defined at runtime?
即使您有attr_reader :test
@test
,Tester
是Class
类对象(类s
的对象)的实例变量,您的代码也无效而不是Tester
实例对象的实例变量(类{{1}}的对象)。
答案 2 :(得分:0)
这是“puts @test
”.................................
答案 3 :(得分:0)
在您的代码中,您调用的方法Kernel#test
没有参数。但是Kernel#test
需要参数,因此您会收到一个错误,告诉您没有提供足够的参数(即您根本没有提供参数)。
如果在ruby中没有定义方法测试,你会收到一条错误消息告诉你,你正试图调用一个未定义的方法,这可能不会让你感到困惑。
显然,您不打算调用名为test
的方法 - 您想要访问实例变量@test
。为此,您必须写puts @test
而不是puts test
。但是,由于您从未在新的@test
实例上设置变量Test
,因此仍无法执行您想要的操作。您只需为类设置一次@test
变量。相反,您应该在@test
的{{1}}方法中设置initialize
。