Каков эквивалент событий.NET в Ruby?

$("#open").click(function(){
  $("#todolist").DataTable().draw();
});

Используйте эту функцию везде, где вы хотите обновить данные.

11
задан Gishu 29 October 2008 в 09:26
поделиться

5 ответов

Во-первых, в Ruby нет никаких сигнатур методов. Самое близкое проверило бы арность функции. Утиный ввод требует взглядов по-другому (немного).

Заметный модуль является запуском, но если у Вас есть требование, чтобы иметь несколько событий от единого класса, это не могло бы быть достаточно.

Это - быстрый эскиз. Это поддерживает методы и блоки. Измените по мере необходимости для адаптации к коду, распараллелив подход, и т.д. Например, Вы могли использовать method_missing, чтобы иметь имя события в имени метода вместо того, чтобы иметь его в качестве параметра.

class EventBase
    def initialize
        @listeners = Hash.new
    end

    def listen_event(name, *func, &p)
        if p
            (@listeners[name] ||= Array.new) << p
        else
            (@listeners[name] ||= Array.new) << func[0]
        end
    end

    def ignore_event(name, func)
        return if !@listeners.has_key?(name)
        @listeners[name].delete_if { |o| o == func }
    end

    def trigger_event(name, *args)
        return if !@listeners.has_key?(name)
        @listeners[name].each { |f| f.call(*args) }
    end
end


class MyClass < EventBase
    def raise_event1(*args)
        trigger_event(:event1, *args)
    end

    def raise_event2(*args)
        trigger_event(:event2, *args)
    end
end

class TestListener
    def initialize(source)
        source.listen_event(:event1, method(:event1_arrival))
        source.listen_event(:event2) do |*a|
            puts "event 2 arrival, args #{a}"
        end
    end

    def event1_arrival(*a)
        puts "Event 1 arrived, args #{a}"
    end
end

s = MyClass.new
l = TestListener.new(s)

s.raise_event1("here is event 1")
s.raise_event2("here is event 2")
8
ответ дан 3 December 2019 в 06:23
поделиться
2
ответ дан 3 December 2019 в 06:23
поделиться

Я повторил бы это нет аналога уровня языка в Ruby к событиям.NET. Способ, которым соглашения о направляющих с ним с ActiveSupport:: Обратные вызовы (существует пример на той странице).

2
ответ дан 3 December 2019 в 06:23
поделиться

Почему бы не написать свой собственный класс событий? Что-то вроде

class Event
  def initialize
    @handlers = Array.new
  end

  def fire
    @handlers.each do |v|
      v.call
    end
  end

  def << handler
    @handlers << handler
  end
end

e = Event.new

e << lambda { puts "hello" }
e << lambda { puts "test" }
e.fire

Это всего лишь минимальный образец, но его можно расширить любым способом. Добавьте в .Net параметры, такие как sender и eventArgs, или что угодно; -)

6
ответ дан 3 December 2019 в 06:23
поделиться

Я написал драгоценный камень именно для этого, потому что у меня была точно такая же проблема. Попробуйте следующее:

gem install ruby_events

Следуйте инструкциям на http://github.com/nathankleyn/ruby_events , но в двух словах:

require 'rubygems'
require 'ruby_events'

class Example
  def initialize
    events.listen(:test_event) do |event_data|
      puts 'Hai there!'
      puts event_data
    end
  end

  def call_me
    events.fire(:test_event, 'My name is Mr Test Man!')
  end
end

e = Example.new
e.call_me # Fires the event, and our handler gets called!
0
ответ дан 3 December 2019 в 06:23
поделиться