Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/21.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
Ruby 关于这个(初学者)示例代码,我有很多问题_Ruby - Fatal编程技术网

Ruby 关于这个(初学者)示例代码,我有很多问题

Ruby 关于这个(初学者)示例代码,我有很多问题,ruby,Ruby,代码如下 1在Ruby手册中,它说类之间的大于、小于等符号检查从属关系,返回布尔值。但我们看到了 class RubyCSV < ActsAsCSV end 我可以理解这是否定义了一个新的RubyCSV,从属于actsascv,但是Ruby手册说左边的类实际上是父类!从那时起,该计划似乎将RubyCSV视为ACTSASCV。这是怎么回事 2“File.new”创建一个新的空白文件,对吗?那么,为什么在下一行代码开始尝试使用“get”从中读取呢?难道没有什么可以得到的吗 3我被告知,如果没

代码如下

1在Ruby手册中,它说类之间的大于、小于等符号检查从属关系,返回布尔值。但我们看到了

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)