对象的Ruby调用方法,而不是将对象作为参数传递给方法

时间:2014-09-05 15:41:21

标签: ruby methods

尝试理解如何编写可以在对象上调用的实例方法(通过Object#my_method表示法)。我只能通过将我的对象作为参数传递给方法来获得所需的结果,但我想了解另一种编写方法的方法。

class Anagram
  attr_reader :test_word

  def initialize(test_word)
    @test_word = test_word.downcase
  end

  def word_stats(word)
    word.downcase.split("").inject(Hash.new(0)) { |h,v| h[v] += 1; h }
  end

  def match(word_list)
    word_list.delete_if { |word| word.downcase == test_word }
      word_list.find_all do |word|
        word_stats(test_word) == word_stats(word)  # <= ** THIS LINE **
      end
  end

end

我知道我需要更改word_stats方法,但我不确定如何以粗体重写该行,以便我可以这样做:

test_word.word_stats == word.word_stats

这是send的合适位置吗?有没有办法编写word_stats方法,以便它不需要参数?

谢谢!

3 个答案:

答案 0 :(得分:1)

如果您不希望您的方法需要参数,那么请不要在其定义中指定一个参数。在该方法中,如果您需要引用调用它的整个对象,那么您可以通过self关键字进行操作,但通常只需访问其属性,您可以直接执行此操作。

def word_stats
    @test_word.downcase.split("").inject(Hash.new(0)) { |h,v| h[v] += 1; h }
end

答案 1 :(得分:1)

如果我的理解是正确的,您需要为课程word_stats定义word.class,我期望这是String

class String
  def word_stats
    self.downcase.split("").inject(Hash.new(0)) { |h,v| h[v] += 1; h }
  end
end

"My dog has fleas".word_stats
  #=> {"m"=>1, "y"=>1, " "=>3, "d"=>1, "o"=>1, "g"=>1, 
  #    "h=>1,  "a"=>2, "s"=>2, "f"=>1, "l"=>1, "e"=>1}

这是你想要做的吗?

答案 2 :(得分:1)

MonkeyPatching没有任何问题,特别是如果你有一个只做Anagram东西的小程序。如果您不在大型或开源项目上工作。猴子补丁!

除了:查看Ruby Refinements以获得限制Ruby 2.0 +中猴子补丁范围的好方法

我建议将您的方法更改为布尔值,并将其命名为它的作用,检查该单词是否为字谜。

我还提供了一个稍微明显的算法。

class String
  def anagram? ( check_me )
    self.downcase.chars.sort == check_me.downcase.chars.sort
  end
end

def match(word_list)
  word_list.delete_if { |word| word.downcase == test_word.downcase } # might want to downcase test_word as well, unless you know it's downcase already
  word_list.find_all do |word|
    word.anagram?(test_word)
  end
end