Как создать метод глобальной строки - PullRequest
0 голосов
/ 06 июня 2018

Я хочу создать глобальный String метод, используемый как: "string".convert_to_date, чтобы я мог использовать его так же, как "abc".length или "abc".upcase.

Как я могу определить convert_to_dateметод?

Ответы [ 3 ]

0 голосов
/ 06 июня 2018

В качестве альтернативы исправлениям вы также можете определять исправления с помощью уточнений.Это сделает патч доступным только в определенной области.Это не обязательно проблема с String.convert_to_date, но в крупномасштабном проекте часто рекомендуется избегать явной подмены обезьян, чтобы избежать конфликтов с кодом гемов.

Уточнение определяется и используется следующим образом:

module StringRefinement
  refine String do
    def convert_to_date
      self + " world"
    end
  end
end

class SomeClass
  using StringRefinement
  "hello".convert_to_date # => "hello world"
end

"hello".convert_to_date # => NoMethodError
0 голосов
/ 06 июня 2018

Спасибо @Subash и @max pleaner, ваши ответы помогли мне найти решение.И вот мое решение:

в config / initializers / StringRefinementDate.rb:

module StringRefinementDate
  def convert_to_date
    self + " world"
  end
end
String.include StringRefinementDate

В models, controllers и views просто используйте:

"hello".convert_to_date # => "hello world"
0 голосов
/ 06 июня 2018

вы можете открыть любой класс в ruby, чтобы добавить к нему методы, для вашего случая вы можете сделать

class String
  def convert_to_date
    # do something with the string, self will contain the value of the string 
  end
end

Это сделает этот метод доступным для любого строкового объекта, поэтому убедитесь, что вы знаете, что выделать и нет никаких побочных эффектов.

Это называется патч обезьяны, я не уверен, что это лучший способ для вашего случая использования без дополнительного контекста

Если вы просто пытаетесьЧтобы преобразовать строковую дату в объект даты или времени, уже есть такие методы, как Time.parse или DateTime.parse

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...