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_Each_Instance Variables - Fatal编程技术网

Arrays Ruby-访问实例变量时出错

Arrays Ruby-访问实例变量时出错,arrays,ruby,each,instance-variables,Arrays,Ruby,Each,Instance Variables,我正在学习Ruby,在制作程序时遇到了一个问题 我有一个类“LineAnalyzer”,它有4个参数(提供2个,计算2个)。两个计算参数都是:@high_wf_count(整数)和@high_wf_words(数组)。 然后,我有一个: class Solution < LineAnalyzer attr_reader :analyzers, :highest_count_across_lines, :highes

我正在学习Ruby,在制作程序时遇到了一个问题

我有一个类“LineAnalyzer”,它有4个参数(提供2个,计算2个)。两个计算参数都是:@high_wf_count(整数)和@high_wf_words(数组)。 然后,我有一个:

class Solution < LineAnalyzer
    attr_reader :analyzers, 
                :highest_count_across_lines, 
                :highest_count_words_across_lines

    def initialize
        @analyzers = [] 
    end

    def analyze_file
        File.foreach('test.txt') do |line|
            @analyzers << LineAnalyzer.new(line.chomp,@analyzers.length+1)
        end 
    end

    def calculate_line_with_highest_frequency
        @highest_count_words_across_lines = []
        @highest_count_across_lines = @analyzers.max_by do 
            |a| a.instance_variable_get(:@highest_wf_count)
        end .instance_variable_get(:@highest_wf_count)

        @highest_count_words_across_lines << @analyzers.each do
            |a| a.instance_variable_get(:@highest_wf_count) == @highest_count_across_lines
        end .instance_variable_get(:@highest_wf_words)
    end    
end
类解决方案@analyzers您的问题似乎出在这段代码中:

@highest_count_words_across_lines << @analyzers.each do
    |a| a.instance_variable_get(:@highest_wf_count) == @highest_count_across_lines
end .instance_variable_get(:@highest_wf_words)

@highest\u count\u words\u跨行您的问题似乎在于这段代码:

@highest_count_words_across_lines << @analyzers.each do
    |a| a.instance_variable_get(:@highest_wf_count) == @highest_count_across_lines
end .instance_variable_get(:@highest_wf_words)

@highest\u count\u words\u跨行这比需要(或应该)复杂得多

为什么
解决方案
子类
线性分析器
?为什么要使用
实例变量\u get
?您应该在LineAnalyzer类上使用
attr\u reader
定义getter方法,这样您就可以调用方法,而不是使用
instance\u variable\u get
,这是一种蛮力方法,只能作为最后手段使用

我认为你应该在继续之前解决这个问题

使用attr_reader创建实例方法时,计算最大值变得非常简单:

highest_count_across_lines = @analyzers.map(&:highest_wf_count).max
我认为您的错误可能是由以下几行造成的:

 @highest_count_words_across_lines << @analyzers.each do
            |a| a.instance_variable_get(:@highest_wf_count) == @highest_count_across_lines
        end .instance_variable_get(:@highest_wf_words)

@highest\u count\u words\u跨行这比需要(或应该)复杂得多

为什么
解决方案
子类
线性分析器
?为什么要使用
实例变量\u get
?您应该在LineAnalyzer类上使用
attr\u reader
定义getter方法,这样您就可以调用方法,而不是使用
instance\u variable\u get
,这是一种蛮力方法,只能作为最后手段使用

我认为你应该在继续之前解决这个问题

使用attr_reader创建实例方法时,计算最大值变得非常简单:

highest_count_across_lines = @analyzers.map(&:highest_wf_count).max
我认为您的错误可能是由以下几行造成的:

 @highest_count_words_across_lines << @analyzers.each do
            |a| a.instance_variable_get(:@highest_wf_count) == @highest_count_across_lines
        end .instance_variable_get(:@highest_wf_words)

@highest\u count\u words\u横跨\u行这里有很多事情,大多数代码都是由于编写Ruby时违反了规则。使用
instance\u variable\u get
应该是绝对的最后手段。仅仅触及一个对象并拉出一个变量被认为是非常不礼貌的。它会产生丑陋和不受欢迎的相互依赖关系。如果另一个对象想给你这个值,它会有一个方法来访问它

在我看来,你要做的事情可以归结为:

def highest_frequency
  @analyzers.map do |a|
    a.highest_wf_count
  end.sort.last
end
Analyzer
实现
最高wf\u计数
作为一种方法,即使它只是一个
attr\u读取器
。这使您可以灵活地更改计算该值的方式和时间。也许在初始化对象时不需要这样做。也许它是在另一个线程中完成的,或者它是惰性地进行评估的


只要有可能,尝试将代码构造为一系列直接的转换。尽量不要制造复杂的、分支的、丑陋的比较。只要有可能,就依赖于Enumerable,它通常有一个方法可以完全满足您的需要,或者有两个方法可以完美地完成这项工作。

这里有很多事情要做,大多数代码都是由于编写Ruby时违反了规则。使用
instance\u variable\u get
应该是绝对的最后手段。仅仅触及一个对象并拉出一个变量被认为是非常不礼貌的。它会产生丑陋和不受欢迎的相互依赖关系。如果另一个对象想给你这个值,它会有一个方法来访问它

在我看来,你要做的事情可以归结为:

def highest_frequency
  @analyzers.map do |a|
    a.highest_wf_count
  end.sort.last
end
Analyzer
实现
最高wf\u计数
作为一种方法,即使它只是一个
attr\u读取器
。这使您可以灵活地更改计算该值的方式和时间。也许在初始化对象时不需要这样做。也许它是在另一个线程中完成的,或者它是惰性地进行评估的


只要有可能,尝试将代码构造为一系列直接的转换。尽量不要制造复杂的、分支的、丑陋的比较。只要有可能,就使用Enumerable,它通常有一个方法可以完全满足您的需要,或者有两个方法可以完美地完成这项工作。

非常感谢!!我没有注意到这些函数之间的区别。还有,有没有办法在:analyzer中获取所有的值:highest_wf_word,这样它的:highest_wf_计数在一行中是最大的?或者任何更适合这种需要的功能。再次感谢!您可能需要查看
:选择数组上的
方法:这将允许您仅通过跨行具有最高\u计数的分析器来过滤
@分析器。如果您正在使用
:选择
,它还会返回一个数组,您将希望使用
+=
而不是
,非常感谢!!我没有注意到这些函数之间的区别。还有,有没有办法在:analyzer中获取所有的值:highest_wf_word,这样它的:highest_wf_计数在一行中是最大的?或者任何更适合这种需要的功能。再次感谢!您可能需要查看
:选择数组上的
方法:这将允许您仅通过跨行具有最高\u计数的分析器来过滤
@分析器。如果您使用的是
:选择
,它还会返回一个数组,您将希望使用
+=
而不是