File Manager

Current Path : /usr/lib/ruby/gems/3.0.0/gems/rbs-1.0.4/core/
Upload File :
Current File : //usr/lib/ruby/gems/3.0.0/gems/rbs-1.0.4/core/unbound_method.rbs

# Ruby supports two forms of objectified methods. Class Method is used to
# represent methods that are associated with a particular object: these method
# objects are bound to that object. Bound method objects for an object can be
# created using Object#method.
#
# Ruby also supports unbound methods; methods objects that are not associated
# with a particular object. These can be created either by calling
# Module#instance_method or by calling #unbind on a bound method object. The
# result of both of these is an UnboundMethod object.
#
# Unbound methods can only be called after they are bound to an object. That
# object must be a kind_of? the method's original class.
#
#     class Square
#       def area
#         @side * @side
#       end
#       def initialize(side)
#         @side = side
#       end
#     end
#
#     area_un = Square.instance_method(:area)
#
#     s = Square.new(12)
#     area = area_un.bind(s)
#     area.call   #=> 144
#
# Unbound methods are a reference to the method at the time it was objectified:
# subsequent changes to the underlying class will not affect the unbound method.
#
#     class Test
#       def test
#         :original
#       end
#     end
#     um = Test.instance_method(:test)
#     class Test
#       def test
#         :modified
#       end
#     end
#     t = Test.new
#     t.test            #=> :modified
#     um.bind(t).call   #=> :original
#
class UnboundMethod
  # Returns an indication of the number of arguments accepted by a method. Returns
  # a nonnegative integer for methods that take a fixed number of arguments. For
  # Ruby methods that take a variable number of arguments, returns -n-1, where n
  # is the number of required arguments. Keyword arguments will be considered as a
  # single additional argument, that argument being mandatory if any keyword
  # argument is mandatory. For methods written in C, returns -1 if the call takes
  # a variable number of arguments.
  #
  #     class C
  #       def one;    end
  #       def two(a); end
  #       def three(*a);  end
  #       def four(a, b); end
  #       def five(a, b, *c);    end
  #       def six(a, b, *c, &d); end
  #       def seven(a, b, x:0); end
  #       def eight(x:, y:); end
  #       def nine(x:, y:, **z); end
  #       def ten(*a, x:, y:); end
  #     end
  #     c = C.new
  #     c.method(:one).arity     #=> 0
  #     c.method(:two).arity     #=> 1
  #     c.method(:three).arity   #=> -1
  #     c.method(:four).arity    #=> 2
  #     c.method(:five).arity    #=> -3
  #     c.method(:six).arity     #=> -3
  #     c.method(:seven).arity   #=> -3
  #     c.method(:eight).arity   #=> 1
  #     c.method(:nine).arity    #=> 1
  #     c.method(:ten).arity     #=> -2
  #
  #     "cat".method(:size).arity      #=> 0
  #     "cat".method(:replace).arity   #=> 1
  #     "cat".method(:squeeze).arity   #=> -1
  #     "cat".method(:count).arity     #=> -1
  #
  def arity: () -> Integer

  # Bind *umeth* to *obj*. If Klass was the class from which *umeth* was obtained,
  # `obj.kind_of?(Klass)` must be true.
  #
  #     class A
  #       def test
  #         puts "In test, class = #{self.class}"
  #       end
  #     end
  #     class B < A
  #     end
  #     class C < B
  #     end
  #
  #     um = B.instance_method(:test)
  #     bm = um.bind(C.new)
  #     bm.call
  #     bm = um.bind(B.new)
  #     bm.call
  #     bm = um.bind(A.new)
  #     bm.call
  #
  # *produces:*
  #
  #     In test, class = C
  #     In test, class = B
  #     prog.rb:16:in `bind': bind argument must be an instance of B (TypeError)
  #      from prog.rb:16
  #
  def bind: (untyped obj) -> Method

  # Returns the name of the method.
  #
  def name: () -> Symbol

  # Returns the class or module that defines the method. See also Method#receiver.
  #
  #     (1..3).method(:map).owner #=> Enumerable
  #
  def owner: () -> Module

  # Returns the parameter information of this method.
  #
  #     def foo(bar); end
  #     method(:foo).parameters #=> [[:req, :bar]]
  #
  #     def foo(bar, baz, bat, &blk); end
  #     method(:foo).parameters #=> [[:req, :bar], [:req, :baz], [:req, :bat], [:block, :blk]]
  #
  #     def foo(bar, *args); end
  #     method(:foo).parameters #=> [[:req, :bar], [:rest, :args]]
  #
  #     def foo(bar, baz, *args, &blk); end
  #     method(:foo).parameters #=> [[:req, :bar], [:req, :baz], [:rest, :args], [:block, :blk]]
  #
  def parameters: () -> ::Array[[ Symbol, Symbol ]]
                | () -> ::Array[[ Symbol ]]

  # Returns the Ruby source filename and line number containing this method or nil
  # if this method was not defined in Ruby (i.e. native).
  #
  def source_location: () -> [ String, Integer ]?

  # Returns a Method of superclass which would be called when super is used or nil
  # if there is no method on superclass.
  #
  def super_method: () -> UnboundMethod?

  # Returns the original name of the method.
  #
  #     class C
  #       def foo; end
  #       alias bar foo
  #     end
  #     C.instance_method(:bar).original_name # => :foo
  #
  def original_name: () -> Symbol

  # Bind *umeth* to *recv* and then invokes the method with the specified
  # arguments. This is semantically equivalent to `umeth.bind(recv).call(args,
  # ...)`.
  #
  def bind_call: (untyped recv, *untyped args) ?{ (*untyped) -> untyped } -> untyped
end

File Manager Version 1.0, Coded By Lucas
Email: hehe@yahoo.com