Рубиновый метод для замены "=" - PullRequest
0 голосов
/ 23 июня 2010

Я хочу исключить знак "=" по определенной причине.Это может выглядеть так:

cat_that_has_name("Kelly").as(:kelly)
kelly.do_something

Метод «as» здесь используется для генерации метода «kelly», который ссылается на мою кошку.Может ли кто-нибудь помочь мне с этим?

Будут оценены любые предложения.

Обновление:

Йорг был прав, я добавил простой тест, чтобы продемонстрировать свое намерение:

require "test/unit"

class AsTest < Test::Unit::TestCase
  def setup
    @cats = ["Kelly", "Tommy"]
  end

  def teardown
  end

  def test_as
    kelly1 =  get_cat("Kelly")
    get_cat("Kelly").as(:kelly2)
    assert_equal(kelly1.object_id, kelly2.object_id)
  end

  private
  def get_cat(name)
    @cats.each do |cat|
      if cat.to_s==name
        return cat
      end
    end
    return nil
  end
end

1 Ответ

3 голосов
/ 23 июня 2010

Трудно понять, чего вы на самом деле хотите.Если вы хотите получить разумные ответы, вам нужно будет предоставить полный пример кода того, чего вы хотите достичь (например, в опубликованном коде отсутствуют определения для методов cat_that_has_name и so_something).Вам также нужно будет опубликовать полную спецификацию того, что именно вы ожидаете от метода as, с примерами использования и в идеале с комплектом тестов.В конце концов, как мы узнаем, что наш ответ правильный, если вы не определили, что означает «правильный»?

Лучшее, что я мог бы расшифровать из вашего загадочного вопроса, это что-то вроде этого:

class Object
  def as(name)
    s = self
    Object.send(:define_method, name) { s }
    Object.send(:private, name)
  end
end

Но нет способа узнать, работает ли это, потому что если я попытаюсь запустить ваш пример кода, я получу NoMethodError для cat_that_has_name и еще один NoMethodError для so_something.

Также обратите внимание, что ваш вопрос самодостаточен: в строке темы вы спрашиваете о методе замены = (т.е. создании переменных), но в своем вопросе вы говорите о создании методов , что будет означать, что выищите замену для def, а не для =.Опять же, было бы намного проще правильно ответить, если бы был тестовый набор.

...