mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
Allow DelegateClass() to module_eval given block
Methods that return classes often module_eval the given block (e.g. Class.new and Struct.new). This allows DelegateClass to work similarly. This makes it easier to use DelegateClass directly without subclassing, so as not to create an unnecessary subclass. Implements [Feature #15842]
This commit is contained in:
parent
856593cc49
commit
1cd93f1cdf
3 changed files with 22 additions and 1 deletions
5
NEWS
5
NEWS
|
@ -118,6 +118,11 @@ Date::
|
|||
new Japanese era as an informal extension, until the new JIS X 0301 is
|
||||
issued. [Feature #15742]
|
||||
|
||||
Delegate::
|
||||
|
||||
* Object#DelegateClass accepts a block and module_evals it in the context
|
||||
of the returned class, similar to Class.new and Struct.new.
|
||||
|
||||
ERB::
|
||||
|
||||
* Prohibit marshaling ERB instance.
|
||||
|
|
|
@ -360,6 +360,14 @@ end
|
|||
# end
|
||||
# end
|
||||
#
|
||||
# or:
|
||||
#
|
||||
# MyClass = DelegateClass(ClassToDelegateTo) do # Step 1
|
||||
# def initialize
|
||||
# super(obj_of_ClassToDelegateTo) # Step 2
|
||||
# end
|
||||
# end
|
||||
#
|
||||
# Here's a sample of use from Tempfile which is really a File object with a
|
||||
# few special rules about storage location and when the File should be
|
||||
# deleted. That makes for an almost textbook perfect example of how to use
|
||||
|
@ -383,7 +391,7 @@ end
|
|||
# # ...
|
||||
# end
|
||||
#
|
||||
def DelegateClass(superclass)
|
||||
def DelegateClass(superclass, &block)
|
||||
klass = Class.new(Delegator)
|
||||
methods = superclass.instance_methods
|
||||
methods -= ::Delegator.public_api
|
||||
|
@ -410,5 +418,6 @@ def DelegateClass(superclass)
|
|||
klass.define_singleton_method :protected_instance_methods do |all=true|
|
||||
super(all) | superclass.protected_instance_methods
|
||||
end
|
||||
klass.module_eval(&block) if block
|
||||
return klass
|
||||
end
|
||||
|
|
|
@ -22,6 +22,13 @@ class TestDelegateClass < Test::Unit::TestCase
|
|||
assert_equal(:m, obj.m, "[ruby-dev:33116]")
|
||||
end
|
||||
|
||||
def test_delegate_class_block
|
||||
klass = DelegateClass(Array) do
|
||||
alias foo first
|
||||
end
|
||||
assert_equal(1, klass.new([1]).foo)
|
||||
end
|
||||
|
||||
def test_systemcallerror_eq
|
||||
e = SystemCallError.new(0)
|
||||
assert((SimpleDelegator.new(e) == e) == (e == SimpleDelegator.new(e)), "[ruby-dev:34808]")
|
||||
|
|
Loading…
Reference in a new issue