как определить одноэлементный метод в рубиновом методе?

В рубине 1.9 можно было сделать так:

def foo
  val = "a string"
  def val.big
    self.upcase
  end
  val
end

и можно было бы вызвать foo с возвращенной «строкой» или foo.big и получить возвращенную «СТРОКУ».

Однако в Ruby 2.1 это больше невозможно, выдается ошибка «невозможно определить одноэлементный метод». Как будут реализованы методы в версии 2.1 для foo и foo.big?

(Очевидно, что это упрощенный пример, мне нужно реализовать одноэлементный метод для значения, возвращаемого другим методом).

ОБНОВЛЕНИЕ: похоже, что это ВОЗМОЖНО в ruby ​​2.1, но НЕ в контексте класса ActiveRecord!

ВТОРОЕ ОБНОВЛЕНИЕ: Когда val является строкой, это работает. Моя проблема возникает, когда кто-то пытается определить одноэлементный класс для такого числа:

def foo
  val = 42
  def val.smaller
     self - 11
  end
  val
end

это выдает ошибку «TypeError: не удается определить синглтон»


person Les Nightingill    schedule 07.12.2015    source источник
comment
Интересно, ваша проблема в другом? Приведенный выше пример отлично работает как на ruby 2.1.7p400, так и на ruby 2.2.3p173 из быстрого тестирования рубинов, которое у меня было здесь.   -  person Doon    schedule 07.12.2015
comment
да, спасибо, Дун, я сам заметил то же самое после публикации этого. Похоже, что ActiveRecord искажает определение одноэлементного метода.   -  person Les Nightingill    schedule 07.12.2015
comment
Итак, val — это экземпляр ActiveRecord? ЕСЛИ так что это именно? (какой класс)   -  person Doon    schedule 07.12.2015
comment
посмотрите здесь: stackoverflow.com/questions/13962147/ должны иметь непосредственные значения.   -  person Doon    schedule 07.12.2015
comment
это так, да, спасибо Дун.   -  person Les Nightingill    schedule 08.12.2015