尝试理解如何编写可以在对象上调用的实例方法(通过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
方法,以便它不需要参数?
谢谢!
答案 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