Ruby方法链接

Ruby方法链接,ruby,chaining,method-chaining,Ruby,Chaining,Method Chaining,我想用Ruby链接我自己的方法。而不是像这样编写ruby方法并使用它们: def percentage_to_i(percentage) percentage.chomp('%') percentage.to_i end percentage = "75%" percentage_to_i(percentage) => 75 percentage = "75%" percentage.percentage_to_i => 75 我想这样使用它: def percenta

我想用Ruby链接我自己的方法。而不是像这样编写ruby方法并使用它们:

def percentage_to_i(percentage)
  percentage.chomp('%')
  percentage.to_i
end

percentage = "75%"
percentage_to_i(percentage)
=> 75
percentage = "75%"
percentage.percentage_to_i
=> 75
我想这样使用它:

def percentage_to_i(percentage)
  percentage.chomp('%')
  percentage.to_i
end

percentage = "75%"
percentage_to_i(percentage)
=> 75
percentage = "75%"
percentage.percentage_to_i
=> 75

我怎样才能做到这一点

您必须将该方法添加到String类中:

class String
  def percentage_to_i
    self.chomp('%')
    self.to_i
  end
end
class String
    def percentage_to_i
        self.to_i    # or whatever you want
    end
end
通过此操作,您可以获得所需的输出:

percentage = "75%"
percentage.percentage_to_i # => 75
这有点没用,因为
to_i
已经为你做了:

percentage = "75%"
percentage.to_i # => 75
单例方法

def percentage.percentage_to_i
  self.chomp('%')
  self.to_i
end
创建自己的类

class Percent
  def initialize(value)
    @value = value
  end

  def to_i
    @value.chomp('%')
    @value.to_i
  end

  def to_s
    "#{@value}%"
  end
end

你想要什么还不完全清楚

如果希望能够将字符串实例转换为_i,则只需调用_i:

"75%".to_i  => 75
如果您希望它有一些特殊的行为,那么monkey修补String类:

class String
  def percentage_to_i
    self.chomp('%')
    self.to_i
  end
end
class String
    def percentage_to_i
        self.to_i    # or whatever you want
    end
end
如果您真的想链接方法,那么您通常希望返回同一类的修改实例

class String
    def half
        (self.to_f / 2).to_s
    end
end

s = "100"
s.half.half   => "25"

为什么不做一个
Percent
类呢?哈哈,我最终做了这个,然后回来写我自己的答案。等着接受你的。谢谢。谢谢,问题更多的是关于链接,但我不知道我可以单独使用
to_I
做同样的事情。我将该方法添加到
字符串
类中(如您的回答中所示),但是在该模型的类定义的
结束
语句之后的模型文件中(
app/models/content.rb
)。我认为这样做被称为“mixin”。有趣的是,什么时候这比扩展类更有利?我正试图为单例方法所涉及的额外工作找出一个用例?实例上的@Dru单例方法在它们是一次性的东西时非常有用。当我需要将对象变形为API以便在库函数中使用时,我使用过它们,但它们并不经常被使用。当实际上只有一个实例需要一个未在类中定义的不同行为时。它的好处是,您不必更改或扩展类。