Arrays Ruby-访问实例变量时出错
我正在学习Ruby,在制作程序时遇到了一个问题 我有一个类“LineAnalyzer”,它有4个参数(提供2个,计算2个)。两个计算参数都是:@high_wf_count(整数)和@high_wf_words(数组)。 然后,我有一个: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
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计数的分析器来过滤@分析器。如果您使用的是:选择,它还会返回一个数组,您将希望使用+=
而不是