summaryrefslogtreecommitdiff
path: root/kernel.rb
diff options
context:
space:
mode:
Diffstat (limited to 'kernel.rb')
-rw-r--r--kernel.rb165
1 files changed, 120 insertions, 45 deletions
diff --git a/kernel.rb b/kernel.rb
index c8cbc99175..dc5cea1515 100644
--- a/kernel.rb
+++ b/kernel.rb
@@ -17,7 +17,7 @@ module Kernel
#
def class
Primitive.attr! :leaf
- Primitive.cexpr! 'rb_obj_class(self)'
+ Primitive.cexpr! 'rb_obj_class_must(self)'
end
#
@@ -40,7 +40,7 @@ module Kernel
# s1.inspect #=> "#<Klass:0x401b3a38 @str=\"Hi\">"
# s2.inspect #=> "#<Klass:0x401b3998 @str=\"Hi\">"
#
- # This method may have class-specific behavior. If so, that
+ # This method may have class-specific behavior. If so, that
# behavior will be documented under the #+initialize_copy+ method of
# the class.
#
@@ -58,10 +58,10 @@ module Kernel
# a.freeze #=> ["a", "b", "c"]
# a.frozen? #=> true
#--
- # Determines if the object is frozen. Equivalent to \c Object\#frozen? in Ruby.
- # \param[in] obj the object to be determines
- # \retval Qtrue if frozen
- # \retval Qfalse if not frozen
+ # Determines if the object is frozen. Equivalent to `Object#frozen?` in Ruby.
+ # @param[in] obj the object to be determines
+ # @retval Qtrue if frozen
+ # @retval Qfalse if not frozen
#++
#
def frozen?
@@ -73,7 +73,7 @@ module Kernel
# call-seq:
# obj.tap {|x| block } -> obj
#
- # Yields self to the block, and then returns self.
+ # Yields self to the block and then returns self.
# The primary purpose of this method is to "tap into" a method chain,
# in order to perform operations on intermediate results within the chain.
#
@@ -87,6 +87,7 @@ module Kernel
#++
#
def tap
+ Primitive.attr! :inline_block
yield(self)
self
end
@@ -99,54 +100,33 @@ module Kernel
#
# 3.next.then {|x| x**x }.to_s #=> "256"
#
- # Good usage for +then+ is value piping in method chains:
+ # A good use of +then+ is value piping in method chains:
#
# require 'open-uri'
# require 'json'
#
- # construct_url(arguments).
- # then {|url| URI(url).read }.
- # then {|response| JSON.parse(response) }
+ # construct_url(arguments)
+ # .then {|url| URI(url).read }
+ # .then {|response| JSON.parse(response) }
#
- # When called without block, the method returns +Enumerator+,
+ # When called without a block, the method returns an +Enumerator+,
# which can be used, for example, for conditional
# circuit-breaking:
#
- # # meets condition, no-op
+ # # Meets condition, no-op
# 1.then.detect(&:odd?) # => 1
- # # does not meet condition, drop value
+ # # Does not meet condition, drop value
# 2.then.detect(&:odd?) # => nil
#
def then
- unless block_given?
+ Primitive.attr! :inline_block
+ unless defined?(yield)
return Primitive.cexpr! 'SIZED_ENUMERATOR(self, 0, 0, rb_obj_size)'
end
yield(self)
end
- #
- # call-seq:
- # obj.yield_self {|x| block } -> an_object
- #
- # Yields self to the block and returns the result of the block.
- #
- # "my string".yield_self {|s| s.upcase } #=> "MY STRING"
- #
- # Good usage for +then+ is value piping in method chains:
- #
- # require 'open-uri'
- # require 'json'
- #
- # construct_url(arguments).
- # then {|url| URI(url).read }.
- # then {|response| JSON.parse(response) }
- #
- def yield_self
- unless block_given?
- return Primitive.cexpr! 'SIZED_ENUMERATOR(self, 0, 0, rb_obj_size)'
- end
- yield(self)
- end
+ alias yield_self then
module_function
@@ -161,11 +141,12 @@ module Kernel
# loop do
# print "Input: "
# line = gets
+ # # break if q, Q is entered or EOF signal (Ctrl-D on Unix, Ctrl-Z on windows) is sent
# break if !line or line =~ /^q/i
# # ...
# end
#
- # StopIteration raised in the block breaks the loop. In this case,
+ # A StopIteration raised in the block breaks the loop. In this case,
# loop returns the "result" value stored in the exception.
#
# enum = Enumerator.new { |y|
@@ -178,8 +159,9 @@ module Kernel
# puts enum.next
# } #=> :ok
def loop
- unless block_given?
- return enum_for(:loop) { Float::INFINITY }
+ Primitive.attr! :inline_block
+ unless defined?(yield)
+ return Primitive.cexpr! 'SIZED_ENUMERATOR(self, 0, 0, rb_f_loop_size)'
end
begin
@@ -197,10 +179,10 @@ module Kernel
#
# Returns <i>arg</i> converted to a float. Numeric types are
# converted directly, and with exception to String and
- # <code>nil</code> the rest are converted using
- # <i>arg</i><code>.to_f</code>. Converting a String with invalid
- # characters will result in a ArgumentError. Converting
- # <code>nil</code> generates a TypeError. Exceptions can be
+ # <code>nil</code>, the rest are converted using
+ # <i>arg</i><code>.to_f</code>. Converting a String with invalid
+ # characters will result in an ArgumentError. Converting
+ # <code>nil</code> generates a TypeError. Exceptions can be
# suppressed by passing <code>exception: false</code>.
#
# Float(1) #=> 1.0
@@ -216,4 +198,97 @@ module Kernel
Primitive.rb_f_float(arg, exception)
end
end
+
+ # call-seq:
+ # Integer(object, base = 0, exception: true) -> integer or nil
+ #
+ # Returns an integer converted from +object+.
+ #
+ # Tries to convert +object+ to an integer
+ # using +to_int+ first and +to_i+ second;
+ # see below for exceptions.
+ #
+ # With a non-zero +base+, +object+ must be a string or convertible
+ # to a string.
+ #
+ # ==== \Numeric objects
+ #
+ # With an integer argument +object+ given, returns +object+:
+ #
+ # Integer(1) # => 1
+ # Integer(-1) # => -1
+ #
+ # With a floating-point argument +object+ given,
+ # returns +object+ truncated to an integer:
+ #
+ # Integer(1.9) # => 1 # Rounds toward zero.
+ # Integer(-1.9) # => -1 # Rounds toward zero.
+ #
+ # ==== \String objects
+ #
+ # With a string argument +object+ and zero +base+ given,
+ # returns +object+ converted to an integer in base 10:
+ #
+ # Integer('100') # => 100
+ # Integer('-100') # => -100
+ #
+ # With +base+ zero, string +object+ may contain leading characters
+ # to specify the actual base (radix indicator):
+ #
+ # Integer('0100') # => 64 # Leading '0' specifies base 8.
+ # Integer('0b100') # => 4 # Leading '0b' specifies base 2.
+ # Integer('0x100') # => 256 # Leading '0x' specifies base 16.
+ #
+ # With a positive +base+ (in range 2..36) given, returns +object+
+ # converted to an integer in the given base:
+ #
+ # Integer('100', 2) # => 4
+ # Integer('100', 8) # => 64
+ # Integer('-100', 16) # => -256
+ #
+ # With a negative +base+ (in range -36..-2) given, returns +object+
+ # converted to the radix indicator if it exists or
+ # +base+:
+ #
+ # Integer('0x100', -2) # => 256
+ # Integer('100', -2) # => 4
+ # Integer('0b100', -8) # => 4
+ # Integer('100', -8) # => 64
+ # Integer('0o100', -10) # => 64
+ # Integer('100', -10) # => 100
+ #
+ # +base+ -1 is equivalent to the -10 case.
+ #
+ # When converting strings, surrounding whitespace and embedded underscores
+ # are allowed and ignored:
+ #
+ # Integer(' 100 ') # => 100
+ # Integer('-1_0_0', 16) # => -256
+ #
+ # ==== Other classes
+ #
+ # Examples with +object+ of various other classes:
+ #
+ # Integer(Rational(9, 10)) # => 0 # Rounds toward zero.
+ # Integer(Complex(2, 0)) # => 2 # Imaginary part must be zero.
+ # Integer(Time.now) # => 1650974042
+ #
+ # ==== Keywords
+ #
+ # With the optional keyword argument +exception+ given as +true+ (the default):
+ #
+ # - Raises TypeError if +object+ does not respond to +to_int+ or +to_i+.
+ # - Raises TypeError if +object+ is +nil+.
+ # - Raises ArgumentError if +object+ is an invalid string.
+ #
+ # With +exception+ given as +false+, an exception of any kind is suppressed
+ # and +nil+ is returned.
+ #
+ def Integer(arg, base = 0, exception: true)
+ if Primitive.mandatory_only?
+ Primitive.rb_f_integer1(arg)
+ else
+ Primitive.rb_f_integer(arg, base, exception)
+ end
+ end
end