Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 使用ruby在类数组中推送对象_Arrays_Ruby - Fatal编程技术网

Arrays 使用ruby在类数组中推送对象

Arrays 使用ruby在类数组中推送对象,arrays,ruby,Arrays,Ruby,您好,我曾多次尝试将初始化中的变量推送到一个类数组中,但它总是给出这样的错误:“未初始化的类变量@@books in Object(NameError)” 代码如下: class Library @@books = Array.new @@books = [] attr_reader :bookName, :author def initialize(bookName,author) @bookName = bookName @au

您好,我曾多次尝试将初始化中的变量推送到一个类数组中,但它总是给出这样的错误:“未初始化的类变量@@books in Object(NameError)” 代码如下:

class Library
    @@books = Array.new
    @@books = []
    attr_reader :bookName, :author
    def initialize(bookName,author)
        @bookName = bookName
        @author = author
        
        @@books.push(self)
    end
    def countbooks
        $count = 0
        @@books.each do |b|
             count += 1
    end
end

我使用了
@@books.push(self)
将对象的所有变量都放入数组,但它不起作用。

免责声明:我已经有一段时间没有使用Ruby了,所以我的一些知识可能已经过时了。请随意纠正我

您的代码存在多个问题。让我们让您提供的代码进入某种运行状态

首先,countbooks方法中提供的代码缺少一个结尾。它需要一个结束来结束循环。其次,您可以使用Array.new或[],因为它们都创建了一个空数组,但如果同时使用这两个,则只会覆盖第一个新的空数组

如果您现在初始化新类的实例并调用countbooks方法,您将收到一个错误,因为您不访问全局变量$count,而是访问从未初始化过的count。如果您解决了这个问题,现在只需调用countbooks方法,然后调用put($count),就可以得到当前的数字

然而,全局变量通常是不好的做法,所以您应该避免它们。删除$符号,在循环结束后添加一个返回计数,我们复制了数组。length方法,只是慢了很多:)

这将产生以下代码:

class Library
    @@books = []
    attr_reader :bookName, :author
    def initialize(bookName,author)
        @bookName = bookName
        @author = author
        
        @@books.push(self)
    end
    def countbooks
        count = 0
        @@books.each do |b|
             count += 1
        end
        return count
    end
end
代码现在应该是可执行的,但是有一个大问题

类变量@@books: 现在,整个类只有一个数组。这意味着,如果我们创建类库的一个新实例,那么数组将在所有类库中共享

x = Library.new("title","bintree")
y = Library.new("title2","bintree2")
puts(x.countbooks)
puts(y.bookName)
x、 countsbooks将返回2,只有在创建库的新实例时才将新条目推送到数组中

从你的问题中,我了解到你现在试图在课外给@book打电话。这是行不通的。它只存在于Library类中。您也不能使用attr访问器获得访问权限

您可能应该阅读更多关于类、实例,尤其是不同变量类型的内容。这些链接帮助我回答了您的问题:

下面是一个示例,说明了如果我们忽略Array.length等内置函数来实现自己的计数器并避免类(@@)和全局($)变量,代码会是什么样子。如果现在添加attr\u reader:books,则可以访问@books,但最好编写一个方法

class LibraryBTD
    def initialize
        @books = Array.new
        @counter = 0
    end
    
    def addBook(title,author)
        @books.push([title,author])
        @counter += 1
    end
    
    def listAllBooks
        puts("There are currently " + @counter.to_s + " books in the library.")
        @books.each do |book|
            title = book[0]
            author = book[1]
            puts("Title: " + title + " | Author: " + author)
        end
    end
end
如果我们现在创建LibraryBTD的新实例并添加2本书,我们可以将它们与listAllBooks一起列出:

a = LibraryBTD.new
a.addBook("MyBook1","BTD")
a.addBook("MyBook2","BTD")
a.listAllBooks
这将在控制台中输出以下内容:

图书馆目前有两本书

标题:MyBook1 |作者:BTD

标题:MyBook2 |作者:BTD

但是,如果我们创建一个新实例,列表将为空,因为@books只是一个实例变量

b = LibraryBTD.new
b.listAllBooks
图书馆中当前有0本书


提示:使用
[]
而不是
数组。新建
。奇怪的是,你在这里两个都用。注意:Ruby是一种区分大小写的语言,大写字母在语法上有特定的含义。变量和方法名称应为小写字母。大写字母表示形式为
ClassName
CONSTANT\u NAME
的常量。使用此代码和
l=Library.new('Hello','World')
时无法复制。如果您有一个失败的用例,请将其包括在内。@tadman我使用了[]而不是Array.new,但它仍然给出相同的错误。如果您有
类书
,可以将其放入另一个名为
的类中,则此代码更有意义,该类代表一个图书集合。如
l=Library.新建
然后
l