Ruby 关于这个(初学者)示例代码,我有很多问题
代码如下 1在Ruby手册中,它说类之间的大于、小于等符号检查从属关系,返回布尔值。但我们看到了Ruby 关于这个(初学者)示例代码,我有很多问题,ruby,Ruby,代码如下 1在Ruby手册中,它说类之间的大于、小于等符号检查从属关系,返回布尔值。但我们看到了 class RubyCSV < ActsAsCSV end 我可以理解这是否定义了一个新的RubyCSV,从属于actsascv,但是Ruby手册说左边的类实际上是父类!从那时起,该计划似乎将RubyCSV视为ACTSASCV。这是怎么回事 2“File.new”创建一个新的空白文件,对吗?那么,为什么在下一行代码开始尝试使用“get”从中读取呢?难道没有什么可以得到的吗 3我被告知,如果没
class RubyCSV < ActsAsCSV
end
我可以理解这是否定义了一个新的RubyCSV,从属于actsascv,但是Ruby手册说左边的类实际上是父类!从那时起,该计划似乎将RubyCSV视为ACTSASCV。这是怎么回事
2“File.new”创建一个新的空白文件,对吗?那么,为什么在下一行代码开始尝试使用“get”从中读取呢?难道没有什么可以得到的吗 3我被告知,如果没有给出参数,Chomp将去掉默认值。默认参数是什么
4我想我只是不太明白这个CSV文件是如何工作的。我在这里看不到任何二维数据结构@结果似乎包括单个一维数组中所有行的所有内容,包括@headers中的内容
class ActsAsCSV
def read
file = File.new(self.class.to_s.downcase + '.txt')
@headers = file.gets.chomp.split(', ')
file.each do |row|
@result << row.chomp.split(', ')
end
end
def headers
@headers
end
def csv_contents
@result
end
def initialize
@result = []
read
end
end
class RubyCsv < ActsAsCSV
end
m = RubyCsv.new
puts m.headers.inspect
puts m.csv_contents().inspect
让我们首先创建一个名为actsascv.txt的csv文件 让我们看看那个文件
puts IO.read('actsascsv.csv')
Name, Age, IQ
Wilber, 33, 86
Bianca, 18, 143
Bluto, 83, 55
现在考虑Acthsasv类的每个实例方法,其中
这两个实例方法称为getter,因为它们返回实例变量的值。这里的实例变量是@headers和@result。第一个方法是典型的,其中方法的名称与实例变量的名称相同,没有at字符@。奇怪的是,第二个不是命名结果,或者实例变量不是@csv\u内容 这些方法中的第一个通常是使用以下方法创建的:attr_reader :headers
我首先介绍了这两个方法,因为getter和setter通常是在类定义的开头编写的,使用三个属性之一。。。方法1
初始化私有实例方法是在类上调用新方法时调用的。在这里,它将实例变量@result初始化为空数组,并调用read方法。initialize通常是类定义中出现的第一个实例方法
def read
file = File.new(self.class.to_s.downcase + '.txt')
@headers = file.gets.chomp.split(', ')
file.each do |row|
@result << row.chomp.split(', ')
end
end
class方法只接受一个参数,文件名包括路径。这里是4:
看,还有。那么
如图所示,由于没有文件rubycsv.txt,因此引发了异常
使用Ruby读取和写入CSV文件的传统方法是使用类的方法
1另见和
2假设此方法仅从类的其他实例方法调用,则通常会将其定义为私有方法,因此无法从类外部调用
3 CSV文件名的后缀CSV通常为“actsascv.CSV”,但不是必需的。此外,在编写CSV文件时,最好避免在字段分隔符逗号的任一侧添加空格,除非另有规定
4此处使用显式接收器自身。当实例方法中没有显式接收方时,接收方默认为self,因此通常不需要包含self。。然而,当Ruby将class解释为创建类的关键字时,class.to_.downcase会引发一个异常。这是少数几个自我保护的情况之一。实例方法中需要
5 IO类方法通常以文件作为接收器编写。这是允许的,因为File是IO的一个子类,因此继承了后者的方法。但是Ruby手册说左边的类实际上是父类——我不这么认为。你可能看错了。“File.new”会创建一个新的空白文件,对吗?-不,它会打开一个文件。根据您传递的标志,如果文件不存在,可能会自动创建该文件。因此“file.gets.chomp”只是生成file.gets的未修改副本,对吗否。在这种情况下,chomp的参数将具有默认值。@结果似乎包括单个一维数组中所有行的所有内容,包括@headers中的内容。-否。@headers将是一个平面数组,但@result将是一个数组数组。我假设你正在观察这一点,并且在问这到底是怎么发生的?无论如何,制作一个好的堆栈溢出问题需要花费超过90分钟的时间,所以这个限制应该不是问题。此外,当你发布好的、关于主题的、高质量的问题时,你将很快获得声誉,并且这个限制将被取消。然而,这个问题目前的形式很可能会让你投下反对票,这将增加限制。谢谢你给出了非常详尽的答案。正是我需要的。
def headers
@headers
end
def csv_contents
@result
end
acts.headers
#=> ["Name", "Age", "IQ"]
acts.csv_contents
#=> [["Wilber", "33", "86"], ["Bianca", "18", "143"], ["Bluto", "83", "55"]]
attr_reader :headers
def initialize
@result = []
read
end
def read
file = File.new(self.class.to_s.downcase + '.txt')
@headers = file.gets.chomp.split(', ')
file.each do |row|
@result << row.chomp.split(', ')
end
end
file = File.new(self.class.to_s.downcase + '.txt')
a = self
#=> acts
b = a.class
#=> ActsAsCSV
c = b.to_s
#=> "ActsAsCSV"
d = c.downcase
#=> "actsascsv"
e = d + '.txt'
#=> "actsascsv.txt"
file = File.new(e)
#=> #<File:actsascsv.txt>
f = file.gets
#=> "Name, Age, IQ\n"
g = f.chomp
#=> "Name, Age, IQ"
@headers = g.split(', ')
#=> ["Name", "Age", "IQ"]
file.each do |row|
@result << row.chomp.split(', ')
end
#=> [["Wilber", "33", "86"], ["Bianca", "18", "143"], ["Bluto", "83", "55"]]
acts.csv_contents
#=> [["Wilber", "33", "86"], ["Bianca", "18", "143"], ["Bluto", "83", "55"]]
class RubyCsv < ActsAsCSV
end
RubyCsv.superclass
#= ActsAsCSV
m = RubyCsv.new
#=> Errno::ENOENT (No such file or directory @ rb_sysopen - rubycsv.txt)