Как сделать события в Ruby?

Вот метод, который дает вам все комбинации заданного размера из строки случайной длины. Подобно решению quinmars, но работает для разнообразного ввода и k.

Код можно изменить для обертывания, т. Е. 'Dab' из ввода 'abcd' wk = 3.

public void run(String data, int howMany){
    choose(data, howMany, new StringBuffer(), 0);
}


//n choose k
private void choose(String data, int k, StringBuffer result, int startIndex){
    if (result.length()==k){
        System.out.println(result.toString());
        return;
    }

    for (int i=startIndex; i<data.length(); i++){
        result.append(data.charAt(i));
        choose(data,k,result, i+1);
        result.setLength(result.length()-1);
    }
}

Выход для «abcde»:

abc abd abe acd ace ade bcd bce bde cde

16
задан Ash 3 March 2009 в 05:05
поделиться

3 ответа

Я пытался писать библиотеку GUI в Ruby с небольшим C и прежде всего Ruby. Это закончило тем, что было так медленно, я сдался и никогда не выпускал его. Но я записал систему событий для него, что я пытался сделать легче, чем C#. Я переписал его пару раз, чтобы помочь использовать. Я надеюсь, что это несколько полезно.

class EventHandlerArray < Array
  def add_handler(code=nil, &block)
    if(code)
      push(code)
    else
      push(block)
    end
  end
  def add
    raise "error"
  end
  def remove_handler(code)
    delete(code)
  end
  def fire(e)
    reverse_each { |handler| handler.call(e) }
  end
end

# with this, you can do:
#  event.add_handler
#  event.remove_handler
#  event.fire (usually never used)
#  fire_event
#  when_event
# You just need to call the events method and call super to initialize the events:
#  class MyControl
#    events :mouse_down, :mouse_up,
#           :mouse_enter, :mouse_leave
#    def initialize
#      super
#    end
#    def when_mouse_up(e)
#      # do something
#    end
#  end
#  control = MyControl.new
#  control.mouse_down.add_handler {
#    puts "Mouse down"
#  }
# As you can see, you can redefine when_event in a class to handle the event.
# The handlers are called first, and then the when_event method if a handler didn't
# set e.handled to true. If you need when_event to be called before the handlers,
# override fire_event and call when_event before event.fire. This is what painting
# does, for handlers should paint after the control.
#  class SubControl < MyControl
#    def when_mouse_down(e)
#      super
#      # do something
#    end
#  end
def events(*symbols)
  # NOTE: Module#method_added

  # create a module and 'include' it
  modName = name+"Events"
  initStr = Array.new
  readerStr = Array.new
  methodsStr = Array.new
  symbols.each { |sym|
    name = sym.to_s
    initStr << %Q{
      @#{name} = EventHandlerArray.new
    }
    readerStr << ":#{name}"
    methodsStr << %Q{
      def fire_#{name}(e)
        @#{name}.fire(e)
        when_#{name}(e) if(!e.handled?)
      end
      def when_#{name}(e)
      end
    }
  }
  eval %Q{
    module #{modName}
      def initialize(*args)
        begin
          super(*args)
        rescue NoMethodError; end
        #{initStr.join}
      end
      #{"attr_reader "+readerStr.join(', ')}
      #{methodsStr.join}
    end
    include #{modName}
  }
end

class Event
  attr_writer :handled
  def initialize(sender)
    @sender = @sender
    @handled = false
  end
  def handled?; @handled; end
end
4
ответ дан Jordan Miner 3 March 2009 в 15:05
поделиться

Я не уверен в точно, что Вы имеете в виду, но Вы могли, вероятно, использовать исключения в своих классах и повысить их на определенных "событиях". При необходимости в событии для разработки GUI тогда, большинство платформ GUI определяет свой собственный стиль обработки событий.

Hope это несколько отвечает, что Вы - вопрос.

-1
ответ дан nkassis 3 March 2009 в 15:05
поделиться
  • 1
    @hammar: проблема - это you' ре, предполагающее, что это находится в файле C++. Если это - заголовочный файл, it' ll завинчивают, кто бы ни включает его, потому что они don' t ожидают, что это произойдет. (Редактирование: Для временного отключения я предполагаю, что работы, но я надеялся на лучшее решение..) – Mehrdad 16 September 2011 в 19:52

На вопрос уже ответили, но существует , наблюдатель встроил прямо в стандартную библиотеку, если Вы хотите посмотреть на это. Я использовал его в прошлом для маленького игрового проекта, и это работает очень хорошо.

22
ответ дан bojo 3 March 2009 в 15:05
поделиться
  • 1
    Er, я can' t действительно делают это, потому что это портит все позже, которое могло зависеть от макроса по некоторым причинам... it' s довольно плохой взлом, не действительное решение.:\ – Mehrdad 16 September 2011 в 19:48
Другие вопросы по тегам:

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