2014-05-05 52 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