Цепочка методов 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

Как я могу этого добиться?


person Dru    schedule 28.04.2012    source источник
comment
Почему бы не сделать класс Percent?   -  person Andrew Marshall    schedule 28.04.2012


Ответы (3)


Вы должны добавить метод в класс String:

class String
  def percentage_to_i
    self.chomp('%')
    self.to_i
  end
end

При этом вы можете получить желаемый результат:

percentage = "75%"
percentage.percentage_to_i # => 75

Это бесполезно, потому что to_i уже делает это за вас:

percentage = "75%"
percentage.to_i # => 75
person Mischa    schedule 28.04.2012
comment
Ха-ха, я закончил тем, что сделал это и вернулся, чтобы написать свой собственный ответ. Ожидание, чтобы принять ваше. Спасибо. - person Dru; 28.04.2012
comment
Спасибо, вопрос был больше о цепочке, но я не знал, что могу сделать то же самое только с to_i. - person Dru; 29.04.2012
comment
Я добавил метод в класс String (как в вашем ответе), но в файле модели (app/models/content.rb) после оператора end определения класса этой модели. Я думаю, что это называется миксин. - person user664833; 18.09.2012

Не совсем понятно, что вы хотите.

Если вы хотите иметь возможность преобразовать экземпляр String в_i, просто вызовите to_i:

"75%".to_i  => 75

Если вы хотите, чтобы у него было какое-то особое поведение, тогда обезьяна исправит класс String:

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"
person Mark Paine    schedule 28.04.2012

Одноэлементные методы

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
person Ismael    schedule 28.04.2012
comment
Интересно, когда это будет выгоднее расширения класса? Я пытаюсь найти вариант использования дополнительной работы, связанной с методами Singleton? - person Dru; 28.04.2012
comment
Методы @Dru Singleton для экземпляров полезны, когда они одноразовые. Я использовал их, когда мне нужно преобразовать объект в API для использования в библиотечной функции, но они нужны не очень часто. - person Andrew Marshall; 28.04.2012
comment
Когда на самом деле есть только один экземпляр, вам нужно другое поведение, не определенное в классе. Хорошо то, что вам не нужно ни изменять класс, ни расширять его. - person Ismael; 28.04.2012