beerdy
@beerdy
https://vk.com/beerdy

Как добавить метод (расширить класс) для объекта нативного класса в Ruby?

Хочу сделать следующее:
class Hash < Hash
  def valid_json?(json)
    begin
      JSON.parse(json)
      return true
    rescue JSON::ParserError => e
      return false
    end
  end
end

a = Hash.new()

a = {'a'=>'n'}

puts a.valid_json? #=> true


Как правильно?

Или такой пример:
class String
  def is_wtf_string?(str)
    str=='wtf' ? true : false
  end
end

a = String.new
a = 'wtf'
p a.is_wtf_string? #=> true
  • Вопрос задан
  • 1016 просмотров
Решения вопроса 1
beerdy
@beerdy Автор вопроса
https://vk.com/beerdy
Разобрался. Собсна все просто:
class String
  def is_wtf_string?
    self == 'wtf'
  end
end
a = 'wtf'
p a.is_wtf_string? #=> true


#update Александр Швайкин навел на мысль, что так будет лучше:

# ./ExtStandartClass.rb
module ExtString 
  def is_wtf_string?
    self == 'wtf'
  end
end

module ExtFixnum
  def squared
    self*self
  end
end

# добавим расширенные методы
class String; include ExtString; end
class Fixnum; include ExtFixnum; end


# ./SomeCode.rb
# include 'ExtStandartClass.rb'
# ...
a = 'wtf'
p a.is_wtf_string? #=> true
# ...
# где нибудь в коде если приспичит узнать что откуда
p a.method(:to_s) 
p a.method(:is_wtf_string?)
# аналогично
b = 5
p b.squared
p b.method(:to_s) 
p b.method(:squared)
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
shurik_sh
@shurik_sh
Начинающий программист
Добрый день.
Не нужно в классе Hash делать такой метод, т.к. любой хэш это валидный json
Пример:
a = {'a'=>'n'}
a.to_json #=> Валидная строка в формате json

Можно, но я не рекомендую добавлять методы в руби классы, создайте лучше свой и работайте с ним, можете свой класс унаследовать от Hash и делать с ним что хотите
class MyHash < Hash

  def foo_value?
    has_value? 'foo'
  end

end

a = MyHash.new
a[:a] = 'foo'
b = MyHash.new
b[:a] = 'baz'
p a.foo_value?
p b.foo_value?

Просто работать с кодом где много изменений в стандартных классах не удобно.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы