2016-08-30 81 views
3

我对ruby非常陌生。我对着在得到变量值self.method在ruby脚本self.method中访问变量

我的Ruby类/脚本看起来像这样的问题:

class A1 
    def initialize 
    @myUtil = MyUtil.new log 
    @test_hash = @myUtil.loadPropertiesFile(File.dirname(__FILE__) + '/my-tests.properties') 
    end 

    def self.testCases 
    tests = {} 

    @test_hash.each do |k, v| 
     puts "#{k}" 
    end 

    tests 
    end 

    def launch test, testbed, h = {} 

    @test_hash.each do |k, v| 
     puts "#{k}" 
    end 

    end 
end 

我能够在@test_hash在启动方法来打印值,但不是在self.testCases。我犯了什么错误?

+0

你的代码看起来过于复杂。它应该做什么?或者你只是想弄清楚Ruby中的类是如何工作的? – Stefan

+0

看起来像某人在Perl中完成了太多时间。注意像'$ test_hash'这样的全局变量,并且如果你确实声明了它们,则一致地引用它们。这里没有'$'和'@'切换。 – tadman

回答

3

我在代码中看到一些错误。

  • 在你的初始化方法,创建一个全局变量$test_hash,任何时候你把$在变量的前面,它可用的一切。这不是你想要在这种情况下做的事情。在这种情况下,实例变量对你最有效。

  • 您的testCases方法是一种类方法,这意味着您可以在不创建类的新实例的情况下调用它,即A1.new。所以你称之为方法A1.testCases(Ruby使用方法名称的蛇壳,test_cases,只是fyi)。您在initialize方法中初始化test_hash变量,该方法在创建类的新实例之前不会自动获取调用。因此,当您运行'A1.testCases`时,test_hash不存在。

  • 对于行puts "#{k}"是不好的做法。 puts代表放入字符串,它会自动将该变量转换为字符串。你应该使用puts k#{}用于字符串插值。比如“嗨,我的名字是#{姓名},而且我年龄超过了年龄。”

以下是我将如何做到这一点。出于测试目的,我用一个简单的散列替换了test_hash。现在

class A1 
    def initialize 
    @test_hash = {a: 1, b: 2, c: 3, d: 4, e: 5} 
    end 

    def testCases 
    @test_hash.each do |k, v| 
     puts k 
    end 
    end 
end 

,为您打造A1一个新的实例,并调用testCases方法(现在的一个实例方法,而不是一个类的方法)

A1.new.testCases 
+0

另外令人困惑的是在方法中创建了'tests'并且从未使用过,只是返回一个空的哈希值,没有明显的原因。 ''#{k}“'是一个不好的习惯。只需'放入k',转换就会自动完成。 – tadman

+0

这是一个好点,我会更新我的答案 – davidhu2000

+0

嘿,@ davidhu2000,你的修改工程。其实我的问题是我如何使用“self.omeMethod”中初始化方法中的“@test_hash”变量? –

2

难的是要明白,在Ruby中类也是对象。所以a1 = A1.new是一个对象,A1也是一个对象。

通过在initialize中使用@,可以创建属于a1 = A1.new对象的实例变量。

通过使用@内部的self.testCases方法,您可以创建属于A1对象的实例变量。