2016-08-30 125 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對象的實例變量。