mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00

Previously, each of these methods returned self, but it is more useful to return arguments, to allow for simpler method decorators, such as: ```ruby cached private def foo; some_long_calculation; end ``` Where cached sets up caching for the method. For each of these methods, the following behavior is used: 1) No arguments returns nil 2) Single argument is returned 3) Multiple arguments are returned as an array The single argument case is really the case we are trying to optimize for, for the same reason that def was changed to return a symbol for the method. Idea and initial patch from Herwin Quarantainenet. Implements [Feature #12495]
53 lines
1.7 KiB
Ruby
53 lines
1.7 KiB
Ruby
require_relative '../../spec_helper'
|
|
require_relative 'fixtures/classes'
|
|
|
|
describe "main#public" do
|
|
after :each do
|
|
Object.send(:private, :main_private_method)
|
|
Object.send(:private, :main_private_method2)
|
|
end
|
|
|
|
context "when single argument is passed and it is not an array" do
|
|
it "sets the visibility of the given methods to public" do
|
|
eval "public :main_private_method", TOPLEVEL_BINDING
|
|
Object.should_not have_private_method(:main_private_method)
|
|
end
|
|
end
|
|
|
|
context "when multiple arguments are passed" do
|
|
it "sets the visibility of the given methods to public" do
|
|
eval "public :main_private_method, :main_private_method2", TOPLEVEL_BINDING
|
|
Object.should_not have_private_method(:main_private_method)
|
|
Object.should_not have_private_method(:main_private_method2)
|
|
end
|
|
end
|
|
|
|
ruby_version_is "3.0" do
|
|
context "when single argument is passed and is an array" do
|
|
it "sets the visibility of the given methods to public" do
|
|
eval "public [:main_private_method, :main_private_method2]", TOPLEVEL_BINDING
|
|
Object.should_not have_private_method(:main_private_method)
|
|
Object.should_not have_private_method(:main_private_method2)
|
|
end
|
|
end
|
|
end
|
|
|
|
ruby_version_is ''...'3.1' do
|
|
it "returns Object" do
|
|
eval("public :main_private_method", TOPLEVEL_BINDING).should equal(Object)
|
|
end
|
|
end
|
|
|
|
ruby_version_is '3.1' do
|
|
it "returns argument" do
|
|
eval("public :main_private_method", TOPLEVEL_BINDING).should equal(:main_private_method)
|
|
end
|
|
end
|
|
|
|
|
|
it "raises a NameError when given an undefined name" do
|
|
-> do
|
|
eval "public :main_undefined_method", TOPLEVEL_BINDING
|
|
end.should raise_error(NameError)
|
|
end
|
|
end
|