mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
Make Kernel#then, #yield_self, #frozen? builtin (#3283)
* Make Kernel#then, #yield_self, #frozen? builtin * Fix test_jit
This commit is contained in:
parent
a69dd699ee
commit
24fa37d87a
Notes:
git
2020-07-04 10:03:07 +09:00
Merged-By: k0kubun <takashikkbn@gmail.com>
5 changed files with 96 additions and 54 deletions
78
kernel.rb
78
kernel.rb
|
|
@ -48,6 +48,27 @@ module Kernel
|
|||
Primitive.rb_obj_clone2(freeze)
|
||||
end
|
||||
|
||||
#
|
||||
# call-seq:
|
||||
# obj.frozen? -> true or false
|
||||
#
|
||||
# Returns the freeze status of <i>obj</i>.
|
||||
#
|
||||
# a = [ "a", "b", "c" ]
|
||||
# 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
|
||||
#++
|
||||
#
|
||||
def frozen?
|
||||
Primitive.attr! 'inline'
|
||||
Primitive.cexpr! 'rb_obj_frozen_p(self)'
|
||||
end
|
||||
|
||||
#
|
||||
# call-seq:
|
||||
# obj.tap {|x| block } -> obj
|
||||
|
|
@ -70,6 +91,63 @@ module Kernel
|
|||
self
|
||||
end
|
||||
|
||||
#
|
||||
# call-seq:
|
||||
# obj.then {|x| block } -> an_object
|
||||
#
|
||||
# Yields self to the block and returns the result of the block.
|
||||
#
|
||||
# 3.next.then {|x| x**x }.to_s #=> "256"
|
||||
#
|
||||
# Good usage for +then+ is value piping in method chains:
|
||||
#
|
||||
# require 'open-uri'
|
||||
# require 'json'
|
||||
#
|
||||
# construct_url(arguments).
|
||||
# then {|url| open(url).read }.
|
||||
# then {|response| JSON.parse(response) }
|
||||
#
|
||||
# When called without block, the method returns +Enumerator+,
|
||||
# which can be used, for example, for conditional
|
||||
# circuit-breaking:
|
||||
#
|
||||
# # meets condition, no-op
|
||||
# 1.then.detect(&:odd?) # => 1
|
||||
# # does not meet condition, drop value
|
||||
# 2.then.detect(&:odd?) # => nil
|
||||
#
|
||||
def then
|
||||
unless Primitive.block_given_p
|
||||
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| open(url).read }.
|
||||
# then {|response| JSON.parse(response) }
|
||||
#
|
||||
def yield_self
|
||||
unless Primitive.block_given_p
|
||||
return Primitive.cexpr! 'SIZED_ENUMERATOR(self, 0, 0, rb_obj_size)'
|
||||
end
|
||||
yield(self)
|
||||
end
|
||||
|
||||
module_function
|
||||
|
||||
#
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue