Ruby:如何创建.downcase!风格方法?

时间:2014-06-08 16:33:06

标签: ruby methods

我正在学习Ruby,我想知道: 如何创建.downcase!风格方法? 我显然可以使一个方法可以像downcase一样调用(“CAPS LOCK”) 但我想要string.downcase。 显然这是一个例子,我知道存在downcase方法。 你是怎样做的 ? 谢谢!

3 个答案:

答案 0 :(得分:3)

您可以轻松扩展核心类:

class String
  def make_it_downcase!
    replace downcase   # Calls downcase on the current value and replaces it with the result. 
  end
end

看到它的实际效果:

$ irb
irb(main):001:0>     class String
irb(main):002:1>       def make_it_downcase!
irb(main):003:2>         replace downcase
irb(main):004:2>       end
irb(main):005:1>     end
=> :make_it_downcase!
irb(main):006:0> test = "TEST"
=> "TEST"
irb(main):007:0> test.make_it_downcase!
=> "test"
irb(main):008:0> test
=> "test"

答案 1 :(得分:3)

定义方法时,它在对象的上下文中可用并调用。这意味着每个方法调用都有一个隐式范围。 downcase实际上意味着self.downcase

例如,如果您直接定义方法,则会将其作为私有方法添加到脚本的main上下文中。

self
# => main

def downcase
end

# private_methods means self.private_methods

private_methods.include?(:downcase)
# => true

如果希望对象实例在其上下文中调用方法,请在类上定义方法。

class String
  def my_downcase
  end
end

"string".methods.include?(:my_downcase)
# => true

"string".my_downcase

向内置类型添加方法称为 monkey-patching ,这有点令人不悦。最好将对象子类化以添加功能。 String构造函数接受一个非常适合子类化的字符串, String#replace 用于就地修改字符串。

class CoolString < String
  def initialize(str)
    super(str)
  end

  def downcase!
    replace(downcase)
  end
end

str = CoolString.new("STRING")
str.downcase!
str
# => "string"

答案 2 :(得分:0)

您可以像这样扩展字符串类:

class String
  def downcase
     #implementation
  end
end