Разделение на подклассы Fixnum в рубине

Если вы используете EventBus, это, вероятно, гораздо более простое решение:

В вашем фрагменте:

@Override
public void onAttach(Activity activity) {
    super.onAttach(activity);
    EventBus.getDefault().register(this);
}

@Override
public void onDetach() {
    super.onDetach();
    EventBus.getDefault().unregister(this);
}


// This method will be called when a MessageEvent is posted
public void onEvent(BackPressedMessage type){
    getSupportFragmentManager().popBackStack();
}

и в вашем классе деятельности вы можете определить :

@Override
public void onStart() {
    super.onStart();
    EventBus.getDefault().register(this);
}

@Override
public void onStop() {
    EventBus.getDefault().unregister(this);
    super.onStop();
}

// This method will be called when a MessageEvent is posted
public void onEvent(BackPressedMessage type){
    super.onBackPressed();
}

@Override
public void onBackPressed() {
    EventBus.getDefault().post(new BackPressedMessage(true));
}

BackPressedMessage.java - это просто объект POJO

Это очень чисто и нет проблем с интерфейсом / реализацией.

7
задан cloudhead 8 July 2009 в 02:12
поделиться

3 ответа

Вы можете довольно легко настроить реализацию быстрой пересылки самостоятельно:

class MyNum
  def initialize(number)
    @number = number
  end

  def method_missing(name, *args, &blk)
    ret = @number.send(name, *args, &blk)
    ret.is_a?(Numeric) ? MyNum.new(ret) : ret
  end
end

Затем вы можете добавить любые методы в MyNum, но вы в этих методах нужно будет работать с @number, вместо того, чтобы иметь возможность напрямую вызывать super.

17
ответ дан 6 December 2019 в 07:52
поделиться

Не могли бы вы расширить сам FixNum? Например ...

class Fixnum
  def even?
    self % 2 == 0
  end
end

42.even?
2
ответ дан 6 December 2019 в 07:52
поделиться

IIRC, основная реализация Ruby хранит Fixnum как непосредственные значения, используя некоторые младшие биты слова, чтобы пометить его как Fixnum вместо указателя на объект в куче. Вот почему на 32-битной машине Fixnums - это только 29-битные (или что бы там ни было) вместо полного слова.

Таким образом, из-за этого вы не можете добавлять методы к одному «экземпляру» Fixnum , и вы не можете создать его подкласс.

Если вы категорически настроены на наличие класса «Fixnum-like», вам, вероятно, придется создать класс, имеющий переменную экземпляра Fixnum, и соответствующим образом пересылать вызовы методов .

4
ответ дан 6 December 2019 в 07:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: