当前位置: 首页 > 知识库问答 >
问题:

Ruby中的类方法

戚森
2023-03-14

我是Ruby的新手,正在尝试我在Ruby中的前几个程序来理解这些概念。现在,在类方法概念中,在尝试基础知识时,我遇到了以下问题。

我有一个类方法“Servers.valid_requestor”。

这应该检查提供的用户名是否有效,它基于我正在使用的预定义用户名,如果是,它应该在main中执行某些代码。

现在这里的问题是,每当我尝试使用myI获取用户名nput.user_name它返回my_input对象的未定义方法user_name(NoMachodError)

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类中添加一个如下所示的方法,这个问题就会解决,因为我相信我的输入。userName查找方法。

    def user_name
      @user_name
    end

但是我能得到一些关于为什么我需要这个方法的指针吗?我试图理解当你调用像my_input.user这样的东西时,它在内部是如何工作的_name

我试图得到一些关于类方法的详细留档,但在大多数情况下,这些都是用非常简单的例子来解释的,比如一些放置语句。如果有人能解释类方法并在类方法中访问变量、对象等,那将非常有帮助。我看到了类似于“未定义方法”错误ruby中提到的答案,这给了我解决问题的想法,但我需要更多关于它内部工作原理的细节。任何指针都会有所帮助。

共有1个答案

楚嘉玉
2023-03-14

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

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

这种getter方法也可以由attr\u reader:userName定义。如果您更喜欢定义setter(没有读取器),可以执行attr\u setter:userName,这与:

def userName=(value)
  @userName = value
end

最后,如果你想要两者,你可以做attr_accessor: userName

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

 类似资料:
  • 主要内容:类方法,实例方法Dir 是一个表示用于给出操作系统中目录中的文件名的目录流。Dir 类也拥有与目录相关的操作,比如通配符文件名匹配、改变工作目录等。 类方法 序号 方法 & 描述 1 Dir[pat] Dir::glob( pat) 返回一个数组,包含与指定的通配符模式 pat 匹配的文件名: * - 匹配包含 null 字符串的任意字符串 ** - 递归地匹配任意字符串 ? - 匹配任意单个字符 [...] -

  • 主要内容:类方法,实例方法File 表示一个连接到普通文件的 stdio 对象。open 为普通文件返回该类的一个实例。 类方法 序号 方法 & 描述 1 File::atime( path) 返回 path 的最后访问时间。 2 File::basename( path[, suffix]) 返回 path 末尾的文件名。如果指定了 suffix,则它会从文件名末尾被删除。 例如:File.basename("/home

  • 众所周知,在Ruby中,类方法会被继承: 然而,令我惊讶的是,它不适用于混合物: 我知道#extend方法可以做到这一点: 但我正在编写一个包含实例方法和类方法的mixin(或者更确切地说,我想编写): 现在我想做的是: 我想要A,B从公共模块继承实例和类方法。当然,这是行不通的。那么,难道没有一种秘密的方法可以让这个继承在单个模块上工作吗? 对我来说,把它分成两个不同的模块似乎很不优雅,一个是包

  • 本文向大家介绍Ruby中的Proc类及Proc的类方法Proc.new的使用解析,包括了Ruby中的Proc类及Proc的类方法Proc.new的使用解析的使用技巧和注意事项,需要的朋友参考一下 Proc是对块及其context(局部变量的作用域以及栈框架)进行对象化处理之后得到的过程对象。您可以像使用无名函数那样来使用Proc,但它不会导入局部变量的作用域(可以把动态局部变量用作Proc局部变量

  • 例如,以下方法: 我关心的是如果我有多个线程调用。对象是否可能被另一个线程覆盖?换句话说,Thread 1调用并获取返回的

  • 我们在之前的章节讲了 Ruby 的很多对象,学会了如何使用简单的对象(例如:数字和字符串)以及数据结构数组和哈希来完成一些工作,了解如何使用方法,做好了充足的准备。本章中,我会为大家讲解 Ruby 的类,如何创建一个类以及类的实例,以及类的实例方法如何创建。 1. 什么是 Ruby 的类 当 Ruby 运行程序的时候,会创建一个空间,我们使用具体的事物对这些空间进行填充,我们可以调用这些事物的方法