mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
delegate.rb: check if target is set
* lib/delegate.rb (SimpleDelegator#__getobj__): target object must be set. * lib/delegate.rb (DelegateClass#__getobj__): ditto. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@43759 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
2958ecae67
commit
bb6607404a
3 changed files with 30 additions and 5 deletions
|
@ -1,3 +1,9 @@
|
||||||
|
Thu Nov 21 18:47:29 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
|
||||||
|
|
||||||
|
* lib/delegate.rb (SimpleDelegator#__getobj__): target object must be set.
|
||||||
|
|
||||||
|
* lib/delegate.rb (DelegateClass#__getobj__): ditto.
|
||||||
|
|
||||||
Thu Nov 21 18:28:42 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
|
Thu Nov 21 18:28:42 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
|
||||||
|
|
||||||
* lib/tempfile.rb (Tempfile#initialize): use class method to get rid
|
* lib/tempfile.rb (Tempfile#initialize): use class method to get rid
|
||||||
|
|
|
@ -43,11 +43,14 @@
|
||||||
class Delegator < BasicObject
|
class Delegator < BasicObject
|
||||||
kernel = ::Kernel.dup
|
kernel = ::Kernel.dup
|
||||||
kernel.class_eval do
|
kernel.class_eval do
|
||||||
|
alias __raise__ raise
|
||||||
[:to_s,:inspect,:=~,:!~,:===,:<=>,:eql?,:hash].each do |m|
|
[:to_s,:inspect,:=~,:!~,:===,:<=>,:eql?,:hash].each do |m|
|
||||||
undef_method m
|
undef_method m
|
||||||
end
|
end
|
||||||
private_instance_methods.each do |m|
|
private_instance_methods.each do |m|
|
||||||
next if /\Ablock_given\?\z|iterator\?\z/ =~ m
|
if /\Ablock_given\?\z|iterator\?\z|\A__raise__\z/ =~ m
|
||||||
|
next
|
||||||
|
end
|
||||||
undef_method m
|
undef_method m
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
@ -152,7 +155,7 @@ class Delegator < BasicObject
|
||||||
# method calls are being delegated to.
|
# method calls are being delegated to.
|
||||||
#
|
#
|
||||||
def __getobj__
|
def __getobj__
|
||||||
raise NotImplementedError, "need to define `__getobj__'"
|
__raise__ ::NotImplementedError, "need to define `__getobj__'"
|
||||||
end
|
end
|
||||||
|
|
||||||
#
|
#
|
||||||
|
@ -160,7 +163,7 @@ class Delegator < BasicObject
|
||||||
# to _obj_.
|
# to _obj_.
|
||||||
#
|
#
|
||||||
def __setobj__(obj)
|
def __setobj__(obj)
|
||||||
raise NotImplementedError, "need to define `__setobj__'"
|
__raise__ ::NotImplementedError, "need to define `__setobj__'"
|
||||||
end
|
end
|
||||||
|
|
||||||
#
|
#
|
||||||
|
@ -303,6 +306,7 @@ end
|
||||||
class SimpleDelegator<Delegator
|
class SimpleDelegator<Delegator
|
||||||
# Returns the current object method calls are being delegated to.
|
# Returns the current object method calls are being delegated to.
|
||||||
def __getobj__
|
def __getobj__
|
||||||
|
__raise__ ::ArgumentError, "not delegated" unless defined?(@delegate_sd_obj)
|
||||||
@delegate_sd_obj
|
@delegate_sd_obj
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -321,7 +325,7 @@ class SimpleDelegator<Delegator
|
||||||
# puts names[1] # => Sinclair
|
# puts names[1] # => Sinclair
|
||||||
#
|
#
|
||||||
def __setobj__(obj)
|
def __setobj__(obj)
|
||||||
raise ArgumentError, "cannot delegate to self" if self.equal?(obj)
|
__raise__ ::ArgumentError, "cannot delegate to self" if self.equal?(obj)
|
||||||
@delegate_sd_obj = obj
|
@delegate_sd_obj = obj
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
@ -377,10 +381,11 @@ def DelegateClass(superclass)
|
||||||
methods -= [:to_s,:inspect,:=~,:!~,:===]
|
methods -= [:to_s,:inspect,:=~,:!~,:===]
|
||||||
klass.module_eval do
|
klass.module_eval do
|
||||||
def __getobj__ # :nodoc:
|
def __getobj__ # :nodoc:
|
||||||
|
__raise__ ::ArgumentError, "not delegated" unless defined?(@delegate_dc_obj)
|
||||||
@delegate_dc_obj
|
@delegate_dc_obj
|
||||||
end
|
end
|
||||||
def __setobj__(obj) # :nodoc:
|
def __setobj__(obj) # :nodoc:
|
||||||
raise ArgumentError, "cannot delegate to self" if self.equal?(obj)
|
__raise__ ::ArgumentError, "cannot delegate to self" if self.equal?(obj)
|
||||||
@delegate_dc_obj = obj
|
@delegate_dc_obj = obj
|
||||||
end
|
end
|
||||||
methods.each do |method|
|
methods.each do |method|
|
||||||
|
|
|
@ -154,4 +154,18 @@ class TestDelegateClass < Test::Unit::TestCase
|
||||||
end.new(Object.new)
|
end.new(Object.new)
|
||||||
assert_equal("foo", d.send(:foo))
|
assert_equal("foo", d.send(:foo))
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def test_unset_simple_delegator
|
||||||
|
d = SimpleDelegator.allocate
|
||||||
|
assert_raise_with_message(ArgumentError, /not delegated/) {
|
||||||
|
d.__getobj__
|
||||||
|
}
|
||||||
|
end
|
||||||
|
|
||||||
|
def test_unset_delegate_class
|
||||||
|
d = IV.allocate
|
||||||
|
assert_raise_with_message(ArgumentError, /not delegated/) {
|
||||||
|
d.__getobj__
|
||||||
|
}
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
Loading…
Add table
Reference in a new issue