如何在Ruby中调用另一个类中的一个实例方法?

时间:2015-10-25 18:21:42

标签: ruby

我正在尝试学习Ruby,我试图从另一个实例中调用一个实例方法。我的代码如下:

class ScanTextInFile

  attr_accessor :content , :line_number

  def content
    @content
  end

  def line_number
    @line_number
  end

  def content= (text)
    @content = text
  end

  def line_number= (line)
    @line_number = line
  end

  def initialize (content , line_number)
    self.content = content
    self.line_number = line_number
    #self.calculate_word_frequency
  end

  def calculate_word_frequency
    words = self.content.split
    words_hash = Hash.new
    words.each do | word |
      word.downcase!
      if words_hash.has_key?
        words_hash[key] += 1
      else 
        words_hash[key] = 1 
      end
      highest_wf_count = words_hash.values.max
      words_hash.each { |key, value| highest_wf_words.push(key) }
    end 
  end
end

我正在尝试计算单词出现在给定字符串中的次数。我正在使用实例方法calculate_word_frequency。当我注释掉对calculate_word_frequency的调用时,代码运行良好

$ irb -I
irb(main):001:0> require_relative 'test'
=> true
irb(main):002:0> 
irb(main):003:0* 
irb(main):004:0* a = ScanTextInFile.new("Bla bla foo foo bar baz foo bar bar", 1)
=> #<ScanTextInFile:0x007fc7a39b01c8 @content="Bla bla foo foo bar baz foo bar bar", @line_number=1>

但是,当我在calculate_word_frequency块中调用实例方法initialize时,出现错误ArgumentError: wrong number of arguments (0 for 1)

$ irb -I
irb(main):001:0> require_relative 'test'
=> true
irb(main):002:0> a = ScanTextInFile.new("Bla bla foo foo bar baz foo bar bar", 1)
ArgumentError: wrong number of arguments (0 for 1)

我尝试在调用方法时删除self,但我仍然遇到错误。当我调用方法时,我不知道出了什么问题。这样做的正确方法是什么?

3 个答案:

答案 0 :(得分:2)

错误在这里非常具有描述性,在第32行你有这个:

  if words_hash.has_key?

方法Hash#has_key?要求您传入一个参数,如some_hash.has_key?("a_key")

我认为您的意思是这样使用它:words_hash.has_key?(word)

答案 1 :(得分:2)

改变这个:

  if words_hash.has_key?
    words_hash[word] += 1
  else 
    words_hash[word] = 1 
  end

要:

  if words_hash.has_key? word
    words_hash[word] += 1
  else 
    words_hash[word] = 1 
  end

您正在使用Hash#has_key方法而不提供key参数,这就是它失败的原因。

答案 2 :(得分:1)

如果您正在使用attr_accessor,则无需为实例变量定义getter和setter。使用attr_accessor的全部意义在于它可以为您完成。 :)此外,getter和setter通常只被外部类和模块用来访问实例变量;在类中,只需直接访问实例变量。最后,您没有告诉has_key?要查找的密钥,您正在混淆keyword,并且您正在引用数据结构{ {1}}在任何地方都没有定义。

这是您班级的修订版。我不确切地理解你正在尝试做什么 - 看起来你还在编写算法 - 但希望这足以让你继续前进并继续工作:

highest_wf_words