我可以用这种符号在对象上调用自定义方法吗?

时间:2019-01-16 14:25:39

标签: ruby

这是我所追求的一个例子:

def already_taken?
  # Magic goes here...
end

"Charlotte".already_taken?

是否有可能构造一种方法,使我可以直接在String对象上调用它而无需修改String类本身?

2 个答案:

答案 0 :(得分:2)

您可以使用自定义模块修补String类:

module MyStringPatch

  def already_taken?
    'yes'
  end

end

String.include MyStringPatch

"Charlotte".already_taken?

答案 1 :(得分:2)

如果您想将方法添加到任何类(在这种情况下为String)而不用猴子修补它,则应考虑使用Refinements

module StringRefinements 
  refine String do
    def already_taken?
      puts "yes!"
    end
  end
end

# in another file...
using StringRefinements
"Charlotte".already_taken?

already_taken?方法仅在调用using StringRefinements的作用域中可用,而在其他任何地方都不能使用。