mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
* lib/ostruct.rb: a patch from Florian Gross <florgro@gmail.com>
merged to allow recursive inspect (and to_s) for OpenStruct.
[ruby-core:05532]
* lib/observer.rb: a patch from nornagon <nornagon@gmail.com>
merged to allow arbitrary names for update methods.
[ruby-core:05416]
* eval.c (rb_f_fcall): new method to avoid inefficiency of
obj.instance_eval{send(...)} tricks.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@9081 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
f5ac36f1a3
commit
48653d5ef0
4 changed files with 47 additions and 28 deletions
|
|
@ -118,14 +118,15 @@ module Observable
|
|||
|
||||
#
|
||||
# Add +observer+ as an observer on this object. +observer+ will now receive
|
||||
# notifications.
|
||||
# notifications. The second optional argument specifies a method to notify
|
||||
# updates, of which default value is +update+.
|
||||
#
|
||||
def add_observer(observer)
|
||||
@observer_peers = [] unless defined? @observer_peers
|
||||
unless observer.respond_to? :update
|
||||
raise NoMethodError, "observer needs to respond to `update'"
|
||||
def add_observer(observer, func=:update)
|
||||
@observer_peers = {} unless defined? @observer_peers
|
||||
unless observer.respond_to? func
|
||||
raise NoMethodError, "observer does not respond to `#{func.to_s}'"
|
||||
end
|
||||
@observer_peers.push observer
|
||||
@observer_peers[observer] = func
|
||||
end
|
||||
|
||||
#
|
||||
|
|
@ -181,9 +182,9 @@ module Observable
|
|||
def notify_observers(*arg)
|
||||
if defined? @observer_state and @observer_state
|
||||
if defined? @observer_peers
|
||||
for i in @observer_peers.dup
|
||||
i.update(*arg)
|
||||
end
|
||||
@observer_peers.each { |k, v|
|
||||
k.send v, *arg
|
||||
}
|
||||
end
|
||||
@observer_state = false
|
||||
end
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue