提交 8b39dfd6 编写于 作者: M Matthew Draper

Merge pull request #16964 from Agis-/issue-16956

Make delegation work with the reserved words passed to `:to`
* Delegation now works with ruby reserved words passed to `:to` option.
Fixes #16956.
*Agis Anastasopoulos*
* Added method `#eql?` to `ActiveSupport::Duration`, in addition to `#==`.
Currently, the following returns `false`, contrary to expectation:
......
require 'set'
class Module
# Error generated by +delegate+ when a method is called on +nil+ and +allow_nil+
# option is not used.
class DelegationError < NoMethodError; end
RUBY_RESERVED_WORDS = Set.new(
%w(alias and BEGIN begin break case class def defined? do else elsif END
end ensure false for if in module next nil not or redo rescue retry
return self super then true undef unless until when while yield)
).freeze
# Provides a +delegate+ class method to easily expose contained objects'
# public methods as your own.
#
......@@ -163,7 +171,7 @@ def delegate(*methods)
line = line.to_i
to = to.to_s
to = 'self.class' if to == 'class'
to = "self.#{to}" if RUBY_RESERVED_WORDS.include?(to)
methods.each do |method|
# Attribute writer methods only accept one argument. Makes sure []=
......
......@@ -56,8 +56,14 @@ def self.table_name
delegate :name, :to => :client, :prefix => nil
end
Event = Struct.new(:case) do
delegate :foo, :to => :case
end
Tester = Struct.new(:client) do
delegate :name, :to => :client, :prefix => false
def foo; 1; end
end
Product = Struct.new(:name) do
......@@ -495,4 +501,9 @@ def duck; 'duck' end
assert_equal 'duck_with_orange', @instance.duck
assert FooClassWithBarMethod.public_method_defined?(:duck)
end
def test_delegate_with_case
event = Event.new(Tester.new)
assert_equal 1, event.foo
end
end
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册