2014-05-05 89 views
0

我是Ruby新手,正在嘗試使用Ruby中的前幾個程序來理解這些概念。現在,在嘗試基礎知識時,我在Class Method概念中遇到了以下問題。

我有一個類方法「Servers.valid_requestor」。

這應該檢查提供的用戶名是否基於我使用的預定義用戶名是否有效,如果是,則應該執行main中的某段代碼。

現在,這裏的問題是,每當我試圖通過使用myInput.user_name來獲取用戶名,它返回未定義的方法USER_NAME的my_input對象(NoMethodError)Ruby中的類方法

in `validRequestor': undefined method `user_name' for #Object (NoMethodError) 
class Servers 
     # Constructor 
     def initialize(user_name, ip_address, host_name) 
     @user_name = user_name 
     @ip_address = ip_address 
     @host_name = host_name 
     end 

     # Class Method 
     def Servers.valid_requestor(my_input) 
     user_name = my_input.user_name 
     return user_name.to_s == "myUserName" 
     end 

     # Member function 
     def print 
     puts "I am in super" 
     my_details = "Details: #{@user_name} -- #{@ip_address} -- #{@host_name}" 
     end 
    end 

    # MAIN 
    a_server = Servers.new("myUserName", "10.20.30.40", "server1.mydomain.private") 

    if (Servers.valid_requestor(a_server)) 
     my_details = a_server.print 
     puts my_details 
     <do something> 
    end 

如果我添加方法如下在Servers類中,問題解決,因爲我相信myInput.userName查找方法。

def user_name 
     @user_name 
    end 

但我可以得到一些指針,爲什麼我需要這種方法。我想知道如何在內部調用這樣的工作,當你打電話像my_input.user_name

我試圖得到一些關於類方法的詳細文檔,但在大多數情況下,這些都是用一些非常簡單的例子像一些puts語句解釋的。如果任何人都可以在類方法中解釋類方法和訪問變量,對象等,這將非常有用。我看到類似"undefined method" error ruby中提到的答案,這給了我解決問題的想法,但我需要更多關於內部工作方式的更多細節。任何指針都會有幫助。

+0

在Ruby中,只有常量(類,模塊,實際常量)應該在CamelCase中。所有其他名稱的東西(方法,變量,參數,實例變量,...)通常都在snake_case中。除了簡單的美學外,這也影響事物的解決順序。 –

回答

0

你的問題與類方法無關,但與獲得外部世界的實例變量。

所有實例變量(以@開頭)對於實例是私有的。爲了讓它們對外部世界可見,您需要定義將返回它的公共方法,就像您定義的方法一樣。在ruby中,每個方法都返回最後執行的表達式的值,因此在這裏不需要return聲明。

該吸氣劑方法也可以通過attr_reader :userName來定義。如果你寧可選擇定義的setter(不閱讀器),你可以做attr_setter :userName,這是一樣的:

def userName=(value) 
    @userName = value 
end 

最後,如果你想同時,你可以做attr_accessor :userName

其中一個注意:ruby的命名約定 - 我們對方法和變量使用了snake的情況,對常量使用了大的camel表示法。因此它應該是user_name而不是userName

+0

非常感謝。這是我正在尋找的。 – schow