Ruby中的类方法

Ruby中的类方法,ruby,Ruby,我是Ruby新手,为了理解Ruby的概念,我尝试了Ruby中的前几个程序。现在,在尝试基础知识时,我遇到了以下问题。 我有一个类方法Servers.valid\u requestor。这是为了检查所提供的用户名是否有效(基于我使用的预定义用户名),如果是,则应在main中执行某些代码。 现在的问题是,每当我尝试使用myInput.user\u name获取用户名时,它都会为myInput对象NoMethodError返回未定义的方法user\u name 但是我可以得到一些关于为什么我需要这个方

我是Ruby新手,为了理解Ruby的概念,我尝试了Ruby中的前几个程序。现在,在尝试基础知识时,我遇到了以下问题。 我有一个类方法Servers.valid\u requestor。这是为了检查所提供的用户名是否有效(基于我使用的预定义用户名),如果是,则应在main中执行某些代码。 现在的问题是,每当我尝试使用myInput.user\u name获取用户名时,它都会为myInput对象NoMethodError返回未定义的方法user\u name

但是我可以得到一些关于为什么我需要这个方法的指针吗。当您调用类似于my_input.user_name的东西时,我试图理解这在内部是如何工作的


我试图获得一些关于类方法的详细文档,但在大多数情况下,这些文档都是用非常简单的示例(如一些puts语句)来解释的。如果有人能解释类方法并访问类方法中的变量、对象等,那将非常有用。我看到了与中提到的答案类似的答案,这给了我解决问题的想法,但我需要更多关于其内部工作方式的细节。任何指针都会有帮助。

您的问题与类方法无关,而是与获取外部世界的实例变量有关

所有以@开头的实例变量都是该实例的私有变量。要使它们对外部世界可见,您需要定义将返回它的公共方法,就像您定义的方法一样。在ruby中,每个方法都返回最后执行的表达式的值,因此这里不需要返回语句

这个getter方法也可以由attr_reader:userName定义。如果您更喜欢在没有读卡器的情况下定义setter,那么可以使用attr_setter:userName,这与:

def userName=(value)
  @userName = value
end
最后,如果两者都需要,可以使用attr_访问器:userName


注意:ruby命名约定——我们对方法和变量使用snake-case,对常量使用大骆驼符号。因此,它应该是用户名而不是用户名。

非常感谢。这就是我要找的。在Ruby中,只有常量类、模块、实际常量应该在CamelCase中。所有其他名称包括方法、变量、参数、实例变量等。。。通常预计会发生在snake_案中。除了简单的美学之外,这也会影响事物的分解顺序。
    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
    def user_name
      @user_name
    end
def userName=(value)
  @userName = value
end