rbs-relaxed 3.9.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.github/dependabot.yml +22 -0
- data/.github/workflows/comments.yml +35 -0
- data/.github/workflows/dependabot.yml +30 -0
- data/.github/workflows/ruby.yml +82 -0
- data/.github/workflows/typecheck.yml +38 -0
- data/.github/workflows/windows.yml +43 -0
- data/.gitignore +23 -0
- data/.rubocop.yml +68 -0
- data/BSDL +22 -0
- data/CHANGELOG.md +1868 -0
- data/COPYING +56 -0
- data/README.md +203 -0
- data/Rakefile +417 -0
- data/Steepfile +44 -0
- data/config.yml +313 -0
- data/core/array.rbs +4062 -0
- data/core/basic_object.rbs +375 -0
- data/core/binding.rbs +150 -0
- data/core/builtin.rbs +277 -0
- data/core/class.rbs +220 -0
- data/core/comparable.rbs +171 -0
- data/core/complex.rbs +786 -0
- data/core/constants.rbs +96 -0
- data/core/data.rbs +415 -0
- data/core/dir.rbs +981 -0
- data/core/encoding.rbs +1371 -0
- data/core/enumerable.rbs +2405 -0
- data/core/enumerator/product.rbs +92 -0
- data/core/enumerator.rbs +630 -0
- data/core/env.rbs +6 -0
- data/core/errno.rbs +673 -0
- data/core/errors.rbs +760 -0
- data/core/exception.rbs +485 -0
- data/core/false_class.rbs +82 -0
- data/core/fiber.rbs +550 -0
- data/core/fiber_error.rbs +11 -0
- data/core/file.rbs +2936 -0
- data/core/file_test.rbs +331 -0
- data/core/float.rbs +1151 -0
- data/core/gc.rbs +644 -0
- data/core/global_variables.rbs +184 -0
- data/core/hash.rbs +1861 -0
- data/core/integer.rbs +1413 -0
- data/core/io/buffer.rbs +984 -0
- data/core/io/wait.rbs +70 -0
- data/core/io.rbs +3406 -0
- data/core/kernel.rbs +3096 -0
- data/core/marshal.rbs +207 -0
- data/core/match_data.rbs +635 -0
- data/core/math.rbs +729 -0
- data/core/method.rbs +386 -0
- data/core/module.rbs +1704 -0
- data/core/nil_class.rbs +209 -0
- data/core/numeric.rbs +818 -0
- data/core/object.rbs +110 -0
- data/core/object_space/weak_key_map.rbs +166 -0
- data/core/object_space.rbs +190 -0
- data/core/proc.rbs +868 -0
- data/core/process.rbs +2296 -0
- data/core/ractor.rbs +1068 -0
- data/core/random.rbs +237 -0
- data/core/range.rbs +1107 -0
- data/core/rational.rbs +531 -0
- data/core/rb_config.rbs +88 -0
- data/core/rbs/unnamed/argf.rbs +1229 -0
- data/core/rbs/unnamed/env_class.rbs +1209 -0
- data/core/rbs/unnamed/random.rbs +293 -0
- data/core/refinement.rbs +59 -0
- data/core/regexp.rbs +1930 -0
- data/core/ruby_vm.rbs +765 -0
- data/core/rubygems/basic_specification.rbs +6 -0
- data/core/rubygems/config_file.rbs +38 -0
- data/core/rubygems/dependency_installer.rbs +6 -0
- data/core/rubygems/errors.rbs +176 -0
- data/core/rubygems/installer.rbs +15 -0
- data/core/rubygems/path_support.rbs +6 -0
- data/core/rubygems/platform.rbs +7 -0
- data/core/rubygems/request_set.rbs +49 -0
- data/core/rubygems/requirement.rbs +148 -0
- data/core/rubygems/rubygems.rbs +1171 -0
- data/core/rubygems/source_list.rbs +15 -0
- data/core/rubygems/specification.rbs +23 -0
- data/core/rubygems/stream_ui.rbs +5 -0
- data/core/rubygems/uninstaller.rbs +10 -0
- data/core/rubygems/version.rbs +294 -0
- data/core/set.rbs +621 -0
- data/core/signal.rbs +100 -0
- data/core/string.rbs +3583 -0
- data/core/struct.rbs +667 -0
- data/core/symbol.rbs +475 -0
- data/core/thread.rbs +1765 -0
- data/core/thread_group.rbs +79 -0
- data/core/time.rbs +1762 -0
- data/core/trace_point.rbs +477 -0
- data/core/true_class.rbs +98 -0
- data/core/unbound_method.rbs +329 -0
- data/core/warning.rbs +87 -0
- data/docs/CONTRIBUTING.md +106 -0
- data/docs/architecture.md +110 -0
- data/docs/collection.md +192 -0
- data/docs/data_and_struct.md +86 -0
- data/docs/gem.md +57 -0
- data/docs/rbs_by_example.md +309 -0
- data/docs/repo.md +125 -0
- data/docs/sigs.md +167 -0
- data/docs/stdlib.md +147 -0
- data/docs/syntax.md +910 -0
- data/docs/tools.md +17 -0
- data/exe/rbs +7 -0
- data/ext/rbs_extension/extconf.rb +15 -0
- data/ext/rbs_extension/lexer.c +2728 -0
- data/ext/rbs_extension/lexer.h +179 -0
- data/ext/rbs_extension/lexer.re +147 -0
- data/ext/rbs_extension/lexstate.c +175 -0
- data/ext/rbs_extension/location.c +325 -0
- data/ext/rbs_extension/location.h +85 -0
- data/ext/rbs_extension/main.c +33 -0
- data/ext/rbs_extension/parser.c +2973 -0
- data/ext/rbs_extension/parser.h +18 -0
- data/ext/rbs_extension/parserstate.c +397 -0
- data/ext/rbs_extension/parserstate.h +163 -0
- data/ext/rbs_extension/rbs_extension.h +31 -0
- data/ext/rbs_extension/unescape.c +32 -0
- data/goodcheck.yml +91 -0
- data/include/rbs/constants.h +82 -0
- data/include/rbs/ruby_objs.h +72 -0
- data/include/rbs/util/rbs_constant_pool.h +219 -0
- data/include/rbs.h +7 -0
- data/lib/rbs/ancestor_graph.rb +92 -0
- data/lib/rbs/annotate/annotations.rb +199 -0
- data/lib/rbs/annotate/formatter.rb +92 -0
- data/lib/rbs/annotate/rdoc_annotator.rb +400 -0
- data/lib/rbs/annotate/rdoc_source.rb +131 -0
- data/lib/rbs/annotate.rb +8 -0
- data/lib/rbs/ast/annotation.rb +29 -0
- data/lib/rbs/ast/comment.rb +29 -0
- data/lib/rbs/ast/declarations.rb +467 -0
- data/lib/rbs/ast/directives.rb +49 -0
- data/lib/rbs/ast/members.rb +451 -0
- data/lib/rbs/ast/type_param.rb +225 -0
- data/lib/rbs/ast/visitor.rb +137 -0
- data/lib/rbs/buffer.rb +67 -0
- data/lib/rbs/builtin_names.rb +58 -0
- data/lib/rbs/cli/colored_io.rb +48 -0
- data/lib/rbs/cli/diff.rb +83 -0
- data/lib/rbs/cli/validate.rb +357 -0
- data/lib/rbs/cli.rb +1223 -0
- data/lib/rbs/collection/cleaner.rb +38 -0
- data/lib/rbs/collection/config/lockfile.rb +92 -0
- data/lib/rbs/collection/config/lockfile_generator.rb +218 -0
- data/lib/rbs/collection/config.rb +81 -0
- data/lib/rbs/collection/installer.rb +32 -0
- data/lib/rbs/collection/sources/base.rb +14 -0
- data/lib/rbs/collection/sources/git.rb +258 -0
- data/lib/rbs/collection/sources/local.rb +81 -0
- data/lib/rbs/collection/sources/rubygems.rb +48 -0
- data/lib/rbs/collection/sources/stdlib.rb +50 -0
- data/lib/rbs/collection/sources.rb +38 -0
- data/lib/rbs/collection.rb +16 -0
- data/lib/rbs/constant.rb +28 -0
- data/lib/rbs/definition.rb +401 -0
- data/lib/rbs/definition_builder/ancestor_builder.rb +620 -0
- data/lib/rbs/definition_builder/method_builder.rb +254 -0
- data/lib/rbs/definition_builder.rb +845 -0
- data/lib/rbs/diff.rb +125 -0
- data/lib/rbs/environment/use_map.rb +77 -0
- data/lib/rbs/environment.rb +829 -0
- data/lib/rbs/environment_loader.rb +173 -0
- data/lib/rbs/environment_walker.rb +155 -0
- data/lib/rbs/errors.rb +645 -0
- data/lib/rbs/factory.rb +18 -0
- data/lib/rbs/file_finder.rb +28 -0
- data/lib/rbs/location_aux.rb +138 -0
- data/lib/rbs/locator.rb +243 -0
- data/lib/rbs/method_type.rb +143 -0
- data/lib/rbs/namespace.rb +125 -0
- data/lib/rbs/parser/lex_result.rb +15 -0
- data/lib/rbs/parser/token.rb +23 -0
- data/lib/rbs/parser_aux.rb +114 -0
- data/lib/rbs/prototype/helpers.rb +140 -0
- data/lib/rbs/prototype/node_usage.rb +99 -0
- data/lib/rbs/prototype/rb.rb +840 -0
- data/lib/rbs/prototype/rbi.rb +641 -0
- data/lib/rbs/prototype/runtime/helpers.rb +59 -0
- data/lib/rbs/prototype/runtime/reflection.rb +19 -0
- data/lib/rbs/prototype/runtime/value_object_generator.rb +279 -0
- data/lib/rbs/prototype/runtime.rb +667 -0
- data/lib/rbs/repository.rb +127 -0
- data/lib/rbs/resolver/constant_resolver.rb +219 -0
- data/lib/rbs/resolver/type_name_resolver.rb +91 -0
- data/lib/rbs/sorter.rb +198 -0
- data/lib/rbs/substitution.rb +83 -0
- data/lib/rbs/subtractor.rb +201 -0
- data/lib/rbs/test/errors.rb +80 -0
- data/lib/rbs/test/guaranteed.rb +30 -0
- data/lib/rbs/test/hook.rb +212 -0
- data/lib/rbs/test/observer.rb +19 -0
- data/lib/rbs/test/setup.rb +84 -0
- data/lib/rbs/test/setup_helper.rb +50 -0
- data/lib/rbs/test/tester.rb +167 -0
- data/lib/rbs/test/type_check.rb +435 -0
- data/lib/rbs/test.rb +112 -0
- data/lib/rbs/type_alias_dependency.rb +100 -0
- data/lib/rbs/type_alias_regularity.rb +126 -0
- data/lib/rbs/type_name.rb +109 -0
- data/lib/rbs/types.rb +1596 -0
- data/lib/rbs/unit_test/convertibles.rb +176 -0
- data/lib/rbs/unit_test/spy.rb +138 -0
- data/lib/rbs/unit_test/type_assertions.rb +347 -0
- data/lib/rbs/unit_test/with_aliases.rb +143 -0
- data/lib/rbs/unit_test.rb +6 -0
- data/lib/rbs/validator.rb +186 -0
- data/lib/rbs/variance_calculator.rb +189 -0
- data/lib/rbs/vendorer.rb +71 -0
- data/lib/rbs/version.rb +5 -0
- data/lib/rbs/writer.rb +424 -0
- data/lib/rbs.rb +94 -0
- data/lib/rdoc/discover.rb +20 -0
- data/lib/rdoc_plugin/parser.rb +163 -0
- data/rbs-relaxed.gemspec +48 -0
- data/schema/annotation.json +14 -0
- data/schema/comment.json +26 -0
- data/schema/decls.json +326 -0
- data/schema/function.json +87 -0
- data/schema/location.json +56 -0
- data/schema/members.json +266 -0
- data/schema/methodType.json +50 -0
- data/schema/typeParam.json +36 -0
- data/schema/types.json +317 -0
- data/sig/ancestor_builder.rbs +163 -0
- data/sig/ancestor_graph.rbs +60 -0
- data/sig/annotate/annotations.rbs +102 -0
- data/sig/annotate/formatter.rbs +24 -0
- data/sig/annotate/rdoc_annotater.rbs +82 -0
- data/sig/annotate/rdoc_source.rbs +30 -0
- data/sig/annotation.rbs +27 -0
- data/sig/buffer.rbs +32 -0
- data/sig/builtin_names.rbs +44 -0
- data/sig/cli/colored_io.rbs +15 -0
- data/sig/cli/diff.rbs +21 -0
- data/sig/cli/validate.rbs +43 -0
- data/sig/cli.rbs +87 -0
- data/sig/collection/cleaner.rbs +13 -0
- data/sig/collection/config/lockfile.rbs +74 -0
- data/sig/collection/config/lockfile_generator.rbs +66 -0
- data/sig/collection/config.rbs +46 -0
- data/sig/collection/installer.rbs +17 -0
- data/sig/collection/sources.rbs +214 -0
- data/sig/collection.rbs +4 -0
- data/sig/comment.rbs +26 -0
- data/sig/constant.rbs +21 -0
- data/sig/declarations.rbs +267 -0
- data/sig/definition.rbs +173 -0
- data/sig/definition_builder.rbs +165 -0
- data/sig/diff.rbs +28 -0
- data/sig/directives.rbs +77 -0
- data/sig/environment.rbs +279 -0
- data/sig/environment_loader.rbs +111 -0
- data/sig/environment_walker.rbs +65 -0
- data/sig/errors.rbs +405 -0
- data/sig/factory.rbs +5 -0
- data/sig/file_finder.rbs +28 -0
- data/sig/location.rbs +110 -0
- data/sig/locator.rbs +58 -0
- data/sig/manifest.yaml +7 -0
- data/sig/members.rbs +258 -0
- data/sig/method_builder.rbs +84 -0
- data/sig/method_types.rbs +58 -0
- data/sig/namespace.rbs +146 -0
- data/sig/parser.rbs +100 -0
- data/sig/prototype/helpers.rbs +27 -0
- data/sig/prototype/node_usage.rbs +20 -0
- data/sig/prototype/rb.rbs +96 -0
- data/sig/prototype/rbi.rbs +75 -0
- data/sig/prototype/runtime.rbs +182 -0
- data/sig/rbs.rbs +21 -0
- data/sig/rdoc/rbs.rbs +67 -0
- data/sig/repository.rbs +85 -0
- data/sig/resolver/constant_resolver.rbs +92 -0
- data/sig/resolver/context.rbs +34 -0
- data/sig/resolver/type_name_resolver.rbs +35 -0
- data/sig/shims/bundler.rbs +38 -0
- data/sig/shims/enumerable.rbs +5 -0
- data/sig/shims/rubygems.rbs +19 -0
- data/sig/sorter.rbs +41 -0
- data/sig/substitution.rbs +48 -0
- data/sig/subtractor.rbs +37 -0
- data/sig/test/errors.rbs +52 -0
- data/sig/test/guranteed.rbs +9 -0
- data/sig/test/type_check.rbs +19 -0
- data/sig/test.rbs +82 -0
- data/sig/type_alias_dependency.rbs +53 -0
- data/sig/type_alias_regularity.rbs +98 -0
- data/sig/type_param.rbs +110 -0
- data/sig/typename.rbs +79 -0
- data/sig/types.rbs +579 -0
- data/sig/unit_test/convertibles.rbs +154 -0
- data/sig/unit_test/spy.rbs +30 -0
- data/sig/unit_test/type_assertions.rbs +196 -0
- data/sig/unit_test/with_aliases.rbs +136 -0
- data/sig/use_map.rbs +35 -0
- data/sig/util.rbs +9 -0
- data/sig/validator.rbs +63 -0
- data/sig/variance_calculator.rbs +87 -0
- data/sig/vendorer.rbs +51 -0
- data/sig/version.rbs +3 -0
- data/sig/visitor.rbs +47 -0
- data/sig/writer.rbs +127 -0
- data/src/constants.c +153 -0
- data/src/ruby_objs.c +795 -0
- data/src/util/rbs_constant_pool.c +342 -0
- data/stdlib/abbrev/0/abbrev.rbs +66 -0
- data/stdlib/abbrev/0/array.rbs +26 -0
- data/stdlib/base64/0/base64.rbs +355 -0
- data/stdlib/benchmark/0/benchmark.rbs +452 -0
- data/stdlib/bigdecimal/0/big_decimal.rbs +1629 -0
- data/stdlib/bigdecimal-math/0/big_math.rbs +119 -0
- data/stdlib/bigdecimal-math/0/manifest.yaml +2 -0
- data/stdlib/cgi/0/core.rbs +1285 -0
- data/stdlib/cgi/0/manifest.yaml +3 -0
- data/stdlib/coverage/0/coverage.rbs +263 -0
- data/stdlib/csv/0/csv.rbs +3776 -0
- data/stdlib/csv/0/manifest.yaml +3 -0
- data/stdlib/date/0/date.rbs +1585 -0
- data/stdlib/date/0/date_time.rbs +616 -0
- data/stdlib/date/0/time.rbs +26 -0
- data/stdlib/dbm/0/dbm.rbs +421 -0
- data/stdlib/delegate/0/delegator.rbs +184 -0
- data/stdlib/delegate/0/kernel.rbs +47 -0
- data/stdlib/delegate/0/simple_delegator.rbs +96 -0
- data/stdlib/did_you_mean/0/did_you_mean.rbs +343 -0
- data/stdlib/digest/0/digest.rbs +577 -0
- data/stdlib/erb/0/erb.rbs +532 -0
- data/stdlib/etc/0/etc.rbs +865 -0
- data/stdlib/fileutils/0/fileutils.rbs +1734 -0
- data/stdlib/find/0/find.rbs +49 -0
- data/stdlib/forwardable/0/forwardable.rbs +268 -0
- data/stdlib/io-console/0/io-console.rbs +414 -0
- data/stdlib/ipaddr/0/ipaddr.rbs +428 -0
- data/stdlib/json/0/json.rbs +1916 -0
- data/stdlib/kconv/0/kconv.rbs +166 -0
- data/stdlib/logger/0/formatter.rbs +45 -0
- data/stdlib/logger/0/log_device.rbs +100 -0
- data/stdlib/logger/0/logger.rbs +796 -0
- data/stdlib/logger/0/manifest.yaml +2 -0
- data/stdlib/logger/0/period.rbs +17 -0
- data/stdlib/logger/0/severity.rbs +34 -0
- data/stdlib/minitest/0/kernel.rbs +42 -0
- data/stdlib/minitest/0/minitest/abstract_reporter.rbs +52 -0
- data/stdlib/minitest/0/minitest/assertion.rbs +17 -0
- data/stdlib/minitest/0/minitest/assertions.rbs +590 -0
- data/stdlib/minitest/0/minitest/backtrace_filter.rbs +23 -0
- data/stdlib/minitest/0/minitest/bench_spec.rbs +102 -0
- data/stdlib/minitest/0/minitest/benchmark.rbs +259 -0
- data/stdlib/minitest/0/minitest/composite_reporter.rbs +25 -0
- data/stdlib/minitest/0/minitest/compress.rbs +13 -0
- data/stdlib/minitest/0/minitest/error_on_warning.rbs +3 -0
- data/stdlib/minitest/0/minitest/expectation.rbs +2 -0
- data/stdlib/minitest/0/minitest/expectations.rbs +21 -0
- data/stdlib/minitest/0/minitest/guard.rbs +64 -0
- data/stdlib/minitest/0/minitest/mock.rbs +64 -0
- data/stdlib/minitest/0/minitest/parallel/executor.rbs +46 -0
- data/stdlib/minitest/0/minitest/parallel/test/class_methods.rbs +5 -0
- data/stdlib/minitest/0/minitest/parallel/test.rbs +3 -0
- data/stdlib/minitest/0/minitest/parallel.rbs +2 -0
- data/stdlib/minitest/0/minitest/pride_io.rbs +62 -0
- data/stdlib/minitest/0/minitest/pride_lol.rbs +19 -0
- data/stdlib/minitest/0/minitest/progress_reporter.rbs +11 -0
- data/stdlib/minitest/0/minitest/reportable.rbs +53 -0
- data/stdlib/minitest/0/minitest/reporter.rbs +5 -0
- data/stdlib/minitest/0/minitest/result.rbs +28 -0
- data/stdlib/minitest/0/minitest/runnable.rbs +163 -0
- data/stdlib/minitest/0/minitest/skip.rbs +6 -0
- data/stdlib/minitest/0/minitest/spec/dsl/instance_methods.rbs +48 -0
- data/stdlib/minitest/0/minitest/spec/dsl.rbs +129 -0
- data/stdlib/minitest/0/minitest/spec.rbs +11 -0
- data/stdlib/minitest/0/minitest/statistics_reporter.rbs +81 -0
- data/stdlib/minitest/0/minitest/summary_reporter.rbs +18 -0
- data/stdlib/minitest/0/minitest/test/lifecycle_hooks.rbs +92 -0
- data/stdlib/minitest/0/minitest/test.rbs +69 -0
- data/stdlib/minitest/0/minitest/unexpected_error.rbs +12 -0
- data/stdlib/minitest/0/minitest/unexpected_warning.rbs +6 -0
- data/stdlib/minitest/0/minitest/unit/test_case.rbs +3 -0
- data/stdlib/minitest/0/minitest/unit.rbs +4 -0
- data/stdlib/minitest/0/minitest.rbs +115 -0
- data/stdlib/monitor/0/monitor.rbs +363 -0
- data/stdlib/mutex_m/0/mutex_m.rbs +104 -0
- data/stdlib/net-http/0/manifest.yaml +3 -0
- data/stdlib/net-http/0/net-http.rbs +5552 -0
- data/stdlib/net-protocol/0/manifest.yaml +2 -0
- data/stdlib/net-protocol/0/net-protocol.rbs +56 -0
- data/stdlib/net-smtp/0/manifest.yaml +2 -0
- data/stdlib/net-smtp/0/net-smtp.rbs +55 -0
- data/stdlib/nkf/0/nkf.rbs +402 -0
- data/stdlib/objspace/0/objspace.rbs +487 -0
- data/stdlib/observable/0/observable.rbs +217 -0
- data/stdlib/open-uri/0/manifest.yaml +4 -0
- data/stdlib/open-uri/0/open-uri.rbs +393 -0
- data/stdlib/open3/0/open3.rbs +147 -0
- data/stdlib/openssl/0/manifest.yaml +3 -0
- data/stdlib/openssl/0/openssl.rbs +12113 -0
- data/stdlib/optparse/0/optparse.rbs +1725 -0
- data/stdlib/pathname/0/pathname.rbs +1406 -0
- data/stdlib/pp/0/manifest.yaml +2 -0
- data/stdlib/pp/0/pp.rbs +300 -0
- data/stdlib/prettyprint/0/prettyprint.rbs +383 -0
- data/stdlib/pstore/0/pstore.rbs +603 -0
- data/stdlib/psych/0/core_ext.rbs +12 -0
- data/stdlib/psych/0/dbm.rbs +237 -0
- data/stdlib/psych/0/manifest.yaml +3 -0
- data/stdlib/psych/0/psych.rbs +402 -0
- data/stdlib/psych/0/store.rbs +59 -0
- data/stdlib/pty/0/pty.rbs +237 -0
- data/stdlib/rdoc/0/code_object.rbs +51 -0
- data/stdlib/rdoc/0/comment.rbs +59 -0
- data/stdlib/rdoc/0/context.rbs +153 -0
- data/stdlib/rdoc/0/markup.rbs +117 -0
- data/stdlib/rdoc/0/parser.rbs +56 -0
- data/stdlib/rdoc/0/rdoc.rbs +391 -0
- data/stdlib/rdoc/0/ri.rbs +17 -0
- data/stdlib/rdoc/0/store.rbs +48 -0
- data/stdlib/rdoc/0/top_level.rbs +97 -0
- data/stdlib/resolv/0/manifest.yaml +3 -0
- data/stdlib/resolv/0/resolv.rbs +1830 -0
- data/stdlib/ripper/0/ripper.rbs +1648 -0
- data/stdlib/securerandom/0/securerandom.rbs +62 -0
- data/stdlib/shellwords/0/shellwords.rbs +229 -0
- data/stdlib/singleton/0/singleton.rbs +131 -0
- data/stdlib/socket/0/addrinfo.rbs +666 -0
- data/stdlib/socket/0/basic_socket.rbs +590 -0
- data/stdlib/socket/0/constants.rbs +2295 -0
- data/stdlib/socket/0/ip_socket.rbs +92 -0
- data/stdlib/socket/0/socket.rbs +4157 -0
- data/stdlib/socket/0/socket_error.rbs +5 -0
- data/stdlib/socket/0/tcp_server.rbs +192 -0
- data/stdlib/socket/0/tcp_socket.rbs +79 -0
- data/stdlib/socket/0/udp_socket.rbs +133 -0
- data/stdlib/socket/0/unix_server.rbs +169 -0
- data/stdlib/socket/0/unix_socket.rbs +172 -0
- data/stdlib/stringio/0/stringio.rbs +567 -0
- data/stdlib/strscan/0/string_scanner.rbs +1627 -0
- data/stdlib/tempfile/0/tempfile.rbs +479 -0
- data/stdlib/time/0/time.rbs +432 -0
- data/stdlib/timeout/0/timeout.rbs +81 -0
- data/stdlib/tmpdir/0/tmpdir.rbs +69 -0
- data/stdlib/tsort/0/cyclic.rbs +5 -0
- data/stdlib/tsort/0/interfaces.rbs +20 -0
- data/stdlib/tsort/0/tsort.rbs +409 -0
- data/stdlib/uri/0/common.rbs +582 -0
- data/stdlib/uri/0/file.rbs +118 -0
- data/stdlib/uri/0/ftp.rbs +13 -0
- data/stdlib/uri/0/generic.rbs +1108 -0
- data/stdlib/uri/0/http.rbs +104 -0
- data/stdlib/uri/0/https.rbs +14 -0
- data/stdlib/uri/0/ldap.rbs +230 -0
- data/stdlib/uri/0/ldaps.rbs +14 -0
- data/stdlib/uri/0/mailto.rbs +92 -0
- data/stdlib/uri/0/rfc2396_parser.rbs +189 -0
- data/stdlib/uri/0/rfc3986_parser.rbs +2 -0
- data/stdlib/uri/0/ws.rbs +13 -0
- data/stdlib/uri/0/wss.rbs +9 -0
- data/stdlib/yaml/0/manifest.yaml +2 -0
- data/stdlib/yaml/0/yaml.rbs +1 -0
- data/stdlib/zlib/0/buf_error.rbs +10 -0
- data/stdlib/zlib/0/data_error.rbs +10 -0
- data/stdlib/zlib/0/deflate.rbs +210 -0
- data/stdlib/zlib/0/error.rbs +20 -0
- data/stdlib/zlib/0/gzip_file/crc_error.rbs +12 -0
- data/stdlib/zlib/0/gzip_file/error.rbs +23 -0
- data/stdlib/zlib/0/gzip_file/length_error.rbs +12 -0
- data/stdlib/zlib/0/gzip_file/no_footer.rbs +11 -0
- data/stdlib/zlib/0/gzip_file.rbs +156 -0
- data/stdlib/zlib/0/gzip_reader.rbs +293 -0
- data/stdlib/zlib/0/gzip_writer.rbs +166 -0
- data/stdlib/zlib/0/inflate.rbs +180 -0
- data/stdlib/zlib/0/mem_error.rbs +10 -0
- data/stdlib/zlib/0/need_dict.rbs +13 -0
- data/stdlib/zlib/0/stream_end.rbs +11 -0
- data/stdlib/zlib/0/stream_error.rbs +11 -0
- data/stdlib/zlib/0/version_error.rbs +11 -0
- data/stdlib/zlib/0/zlib.rbs +449 -0
- data/stdlib/zlib/0/zstream.rbs +200 -0
- metadata +532 -0
data/core/ractor.rbs
ADDED
@@ -0,0 +1,1068 @@
|
|
1
|
+
# <!-- rdoc-file=ractor.rb -->
|
2
|
+
# Ractor is an Actor-model abstraction for Ruby that provides thread-safe
|
3
|
+
# parallel execution.
|
4
|
+
#
|
5
|
+
# Ractor.new makes a new Ractor, which can run in parallel.
|
6
|
+
#
|
7
|
+
# # The simplest ractor
|
8
|
+
# r = Ractor.new {puts "I am in Ractor!"}
|
9
|
+
# r.take # wait for it to finish
|
10
|
+
# # Here, "I am in Ractor!" is printed
|
11
|
+
#
|
12
|
+
# Ractors do not share all objects with each other. There are two main benefits
|
13
|
+
# to this: across ractors, thread-safety concerns such as data-races and
|
14
|
+
# race-conditions are not possible. The other benefit is parallelism.
|
15
|
+
#
|
16
|
+
# To achieve this, object sharing is limited across ractors. For example, unlike
|
17
|
+
# in threads, ractors can't access all the objects available in other ractors.
|
18
|
+
# Even objects normally available through variables in the outer scope are
|
19
|
+
# prohibited from being used across ractors.
|
20
|
+
#
|
21
|
+
# a = 1
|
22
|
+
# r = Ractor.new {puts "I am in Ractor! a=#{a}"}
|
23
|
+
# # fails immediately with
|
24
|
+
# # ArgumentError (can not isolate a Proc because it accesses outer variables (a).)
|
25
|
+
#
|
26
|
+
# The object must be explicitly shared:
|
27
|
+
# a = 1
|
28
|
+
# r = Ractor.new(a) { |a1| puts "I am in Ractor! a=#{a1}"}
|
29
|
+
#
|
30
|
+
# On CRuby (the default implementation), Global Virtual Machine Lock (GVL) is
|
31
|
+
# held per ractor, so ractors can perform in parallel without locking each
|
32
|
+
# other. This is unlike the situation with threads on CRuby.
|
33
|
+
#
|
34
|
+
# Instead of accessing shared state, objects should be passed to and from
|
35
|
+
# ractors by sending and receiving them as messages.
|
36
|
+
#
|
37
|
+
# a = 1
|
38
|
+
# r = Ractor.new do
|
39
|
+
# a_in_ractor = receive # receive blocks until somebody passes a message
|
40
|
+
# puts "I am in Ractor! a=#{a_in_ractor}"
|
41
|
+
# end
|
42
|
+
# r.send(a) # pass it
|
43
|
+
# r.take
|
44
|
+
# # Here, "I am in Ractor! a=1" is printed
|
45
|
+
#
|
46
|
+
# There are two pairs of methods for sending/receiving messages:
|
47
|
+
#
|
48
|
+
# * Ractor#send and Ractor.receive for when the *sender* knows the receiver
|
49
|
+
# (push);
|
50
|
+
# * Ractor.yield and Ractor#take for when the *receiver* knows the sender
|
51
|
+
# (pull);
|
52
|
+
#
|
53
|
+
# In addition to that, any arguments passed to Ractor.new are passed to the
|
54
|
+
# block and available there as if received by Ractor.receive, and the last block
|
55
|
+
# value is sent outside of the ractor as if sent by Ractor.yield.
|
56
|
+
#
|
57
|
+
# A little demonstration of a classic ping-pong:
|
58
|
+
#
|
59
|
+
# server = Ractor.new(name: "server") do
|
60
|
+
# puts "Server starts: #{self.inspect}"
|
61
|
+
# puts "Server sends: ping"
|
62
|
+
# Ractor.yield 'ping' # The server doesn't know the receiver and sends to whoever interested
|
63
|
+
# received = Ractor.receive # The server doesn't know the sender and receives from whoever sent
|
64
|
+
# puts "Server received: #{received}"
|
65
|
+
# end
|
66
|
+
#
|
67
|
+
# client = Ractor.new(server) do |srv| # The server is sent to the client, and available as srv
|
68
|
+
# puts "Client starts: #{self.inspect}"
|
69
|
+
# received = srv.take # The client takes a message from the server
|
70
|
+
# puts "Client received from " \
|
71
|
+
# "#{srv.inspect}: #{received}"
|
72
|
+
# puts "Client sends to " \
|
73
|
+
# "#{srv.inspect}: pong"
|
74
|
+
# srv.send 'pong' # The client sends a message to the server
|
75
|
+
# end
|
76
|
+
#
|
77
|
+
# [client, server].each(&:take) # Wait until they both finish
|
78
|
+
#
|
79
|
+
# This will output something like:
|
80
|
+
#
|
81
|
+
# Server starts: #<Ractor:#2 server test.rb:1 running>
|
82
|
+
# Server sends: ping
|
83
|
+
# Client starts: #<Ractor:#3 test.rb:8 running>
|
84
|
+
# Client received from #<Ractor:#2 server test.rb:1 blocking>: ping
|
85
|
+
# Client sends to #<Ractor:#2 server test.rb:1 blocking>: pong
|
86
|
+
# Server received: pong
|
87
|
+
#
|
88
|
+
# Ractors receive their messages via the *incoming port*, and send them to the
|
89
|
+
# *outgoing port*. Either one can be disabled with Ractor#close_incoming and
|
90
|
+
# Ractor#close_outgoing, respectively. When a ractor terminates, its ports are
|
91
|
+
# closed automatically.
|
92
|
+
#
|
93
|
+
# ## Shareable and unshareable objects
|
94
|
+
#
|
95
|
+
# When an object is sent to and from a ractor, it's important to understand
|
96
|
+
# whether the object is shareable or unshareable. Most Ruby objects are
|
97
|
+
# unshareable objects. Even frozen objects can be unshareable if they contain
|
98
|
+
# (through their instance variables) unfrozen objects.
|
99
|
+
#
|
100
|
+
# Shareable objects are those which can be used by several threads without
|
101
|
+
# compromising thread-safety, for example numbers, `true` and `false`.
|
102
|
+
# Ractor.shareable? allows you to check this, and Ractor.make_shareable tries to
|
103
|
+
# make the object shareable if it's not already, and gives an error if it can't
|
104
|
+
# do it.
|
105
|
+
#
|
106
|
+
# Ractor.shareable?(1) #=> true -- numbers and other immutable basic values are shareable
|
107
|
+
# Ractor.shareable?('foo') #=> false, unless the string is frozen due to # frozen_string_literal: true
|
108
|
+
# Ractor.shareable?('foo'.freeze) #=> true
|
109
|
+
# Ractor.shareable?([Object.new].freeze) #=> false, inner object is unfrozen
|
110
|
+
#
|
111
|
+
# ary = ['hello', 'world']
|
112
|
+
# ary.frozen? #=> false
|
113
|
+
# ary[0].frozen? #=> false
|
114
|
+
# Ractor.make_shareable(ary)
|
115
|
+
# ary.frozen? #=> true
|
116
|
+
# ary[0].frozen? #=> true
|
117
|
+
# ary[1].frozen? #=> true
|
118
|
+
#
|
119
|
+
# When a shareable object is sent (via #send or Ractor.yield), no additional
|
120
|
+
# processing occurs on it. It just becomes usable by both ractors. When an
|
121
|
+
# unshareable object is sent, it can be either *copied* or *moved*. The first is
|
122
|
+
# the default, and it copies the object fully by deep cloning (Object#clone) the
|
123
|
+
# non-shareable parts of its structure.
|
124
|
+
#
|
125
|
+
# data = ['foo', 'bar'.freeze]
|
126
|
+
# r = Ractor.new do
|
127
|
+
# data2 = Ractor.receive
|
128
|
+
# puts "In ractor: #{data2.object_id}, #{data2[0].object_id}, #{data2[1].object_id}"
|
129
|
+
# end
|
130
|
+
# r.send(data)
|
131
|
+
# r.take
|
132
|
+
# puts "Outside : #{data.object_id}, #{data[0].object_id}, #{data[1].object_id}"
|
133
|
+
#
|
134
|
+
# This will output something like:
|
135
|
+
#
|
136
|
+
# In ractor: 340, 360, 320
|
137
|
+
# Outside : 380, 400, 320
|
138
|
+
#
|
139
|
+
# Note that the object ids of the array and the non-frozen string inside the
|
140
|
+
# array have changed in the ractor because they are different objects. The
|
141
|
+
# second array's element, which is a shareable frozen string, is the same
|
142
|
+
# object.
|
143
|
+
#
|
144
|
+
# Deep cloning of objects may be slow, and sometimes impossible. Alternatively,
|
145
|
+
# `move: true` may be used during sending. This will *move* the unshareable
|
146
|
+
# object to the receiving ractor, making it inaccessible to the sending ractor.
|
147
|
+
#
|
148
|
+
# data = ['foo', 'bar']
|
149
|
+
# r = Ractor.new do
|
150
|
+
# data_in_ractor = Ractor.receive
|
151
|
+
# puts "In ractor: #{data_in_ractor.object_id}, #{data_in_ractor[0].object_id}"
|
152
|
+
# end
|
153
|
+
# r.send(data, move: true)
|
154
|
+
# r.take
|
155
|
+
# puts "Outside: moved? #{Ractor::MovedObject === data}"
|
156
|
+
# puts "Outside: #{data.inspect}"
|
157
|
+
#
|
158
|
+
# This will output:
|
159
|
+
#
|
160
|
+
# In ractor: 100, 120
|
161
|
+
# Outside: moved? true
|
162
|
+
# test.rb:9:in `method_missing': can not send any methods to a moved object (Ractor::MovedError)
|
163
|
+
#
|
164
|
+
# Notice that even `inspect` (and more basic methods like `__id__`) is
|
165
|
+
# inaccessible on a moved object.
|
166
|
+
#
|
167
|
+
# Class and Module objects are shareable so the class/module definitions are
|
168
|
+
# shared between ractors. Ractor objects are also shareable. All operations on
|
169
|
+
# shareable objects are thread-safe, so the thread-safety property will be kept.
|
170
|
+
# We can not define mutable shareable objects in Ruby, but C extensions can
|
171
|
+
# introduce them.
|
172
|
+
#
|
173
|
+
# It is prohibited to access (get) instance variables of shareable objects in
|
174
|
+
# other ractors if the values of the variables aren't shareable. This can occur
|
175
|
+
# because modules/classes are shareable, but they can have instance variables
|
176
|
+
# whose values are not. In non-main ractors, it's also prohibited to set
|
177
|
+
# instance variables on classes/modules (even if the value is shareable).
|
178
|
+
#
|
179
|
+
# class C
|
180
|
+
# class << self
|
181
|
+
# attr_accessor :tricky
|
182
|
+
# end
|
183
|
+
# end
|
184
|
+
#
|
185
|
+
# C.tricky = "unshareable".dup
|
186
|
+
#
|
187
|
+
# r = Ractor.new(C) do |cls|
|
188
|
+
# puts "I see #{cls}"
|
189
|
+
# puts "I can't see #{cls.tricky}"
|
190
|
+
# cls.tricky = true # doesn't get here, but this would also raise an error
|
191
|
+
# end
|
192
|
+
# r.take
|
193
|
+
# # I see C
|
194
|
+
# # can not access instance variables of classes/modules from non-main Ractors (RuntimeError)
|
195
|
+
#
|
196
|
+
# Ractors can access constants if they are shareable. The main Ractor is the
|
197
|
+
# only one that can access non-shareable constants.
|
198
|
+
#
|
199
|
+
# GOOD = 'good'.freeze
|
200
|
+
# BAD = 'bad'.dup
|
201
|
+
#
|
202
|
+
# r = Ractor.new do
|
203
|
+
# puts "GOOD=#{GOOD}"
|
204
|
+
# puts "BAD=#{BAD}"
|
205
|
+
# end
|
206
|
+
# r.take
|
207
|
+
# # GOOD=good
|
208
|
+
# # can not access non-shareable objects in constant Object::BAD by non-main Ractor. (NameError)
|
209
|
+
#
|
210
|
+
# # Consider the same C class from above
|
211
|
+
#
|
212
|
+
# r = Ractor.new do
|
213
|
+
# puts "I see #{C}"
|
214
|
+
# puts "I can't see #{C.tricky}"
|
215
|
+
# end
|
216
|
+
# r.take
|
217
|
+
# # I see C
|
218
|
+
# # can not access instance variables of classes/modules from non-main Ractors (RuntimeError)
|
219
|
+
#
|
220
|
+
# See also the description of `# shareable_constant_value` pragma in [Comments
|
221
|
+
# syntax](rdoc-ref:syntax/comments.rdoc) explanation.
|
222
|
+
#
|
223
|
+
# ## Ractors vs threads
|
224
|
+
#
|
225
|
+
# Each ractor has its own main Thread. New threads can be created from inside
|
226
|
+
# ractors (and, on CRuby, they share the GVL with other threads of this ractor).
|
227
|
+
#
|
228
|
+
# r = Ractor.new do
|
229
|
+
# a = 1
|
230
|
+
# Thread.new {puts "Thread in ractor: a=#{a}"}.join
|
231
|
+
# end
|
232
|
+
# r.take
|
233
|
+
# # Here "Thread in ractor: a=1" will be printed
|
234
|
+
#
|
235
|
+
# ## Note on code examples
|
236
|
+
#
|
237
|
+
# In the examples below, sometimes we use the following method to wait for
|
238
|
+
# ractors that are not currently blocked to finish (or to make progress).
|
239
|
+
#
|
240
|
+
# def wait
|
241
|
+
# sleep(0.1)
|
242
|
+
# end
|
243
|
+
#
|
244
|
+
# It is **only for demonstration purposes** and shouldn't be used in a real
|
245
|
+
# code. Most of the time, #take is used to wait for ractors to finish.
|
246
|
+
#
|
247
|
+
# ## Reference
|
248
|
+
#
|
249
|
+
# See [Ractor design doc](rdoc-ref:ractor.md) for more details.
|
250
|
+
#
|
251
|
+
class Ractor
|
252
|
+
# <!--
|
253
|
+
# rdoc-file=ractor.rb
|
254
|
+
# - _require(feature)
|
255
|
+
# -->
|
256
|
+
# internal method
|
257
|
+
#
|
258
|
+
def self._require: (String feature) -> bool
|
259
|
+
|
260
|
+
# <!--
|
261
|
+
# rdoc-file=ractor.rb
|
262
|
+
# - [](sym)
|
263
|
+
# -->
|
264
|
+
# get a value from ractor-local storage of current Ractor
|
265
|
+
#
|
266
|
+
def self.[]: (Symbol) -> untyped
|
267
|
+
|
268
|
+
# <!--
|
269
|
+
# rdoc-file=ractor.rb
|
270
|
+
# - []=(sym, val)
|
271
|
+
# -->
|
272
|
+
# set a value in ractor-local storage of current Ractor
|
273
|
+
#
|
274
|
+
def self.[]=: (Symbol, untyped) -> untyped
|
275
|
+
|
276
|
+
# <!--
|
277
|
+
# rdoc-file=ractor.rb
|
278
|
+
# - count()
|
279
|
+
# -->
|
280
|
+
# Returns the number of Ractors currently running or blocking (waiting).
|
281
|
+
#
|
282
|
+
# Ractor.count #=> 1
|
283
|
+
# r = Ractor.new(name: 'example') { Ractor.yield(1) }
|
284
|
+
# Ractor.count #=> 2 (main + example ractor)
|
285
|
+
# r.take # wait for Ractor.yield(1)
|
286
|
+
# r.take # wait until r will finish
|
287
|
+
# Ractor.count #=> 1
|
288
|
+
#
|
289
|
+
def self.count: () -> Integer
|
290
|
+
|
291
|
+
# <!--
|
292
|
+
# rdoc-file=ractor.rb
|
293
|
+
# - current()
|
294
|
+
# -->
|
295
|
+
# Returns the currently executing Ractor.
|
296
|
+
#
|
297
|
+
# Ractor.current #=> #<Ractor:#1 running>
|
298
|
+
#
|
299
|
+
def self.current: () -> untyped
|
300
|
+
|
301
|
+
# <!--
|
302
|
+
# rdoc-file=ractor.rb
|
303
|
+
# - main()
|
304
|
+
# -->
|
305
|
+
# returns main ractor
|
306
|
+
#
|
307
|
+
def self.main: () -> Ractor
|
308
|
+
|
309
|
+
# <!--
|
310
|
+
# rdoc-file=ractor.rb
|
311
|
+
# - main?()
|
312
|
+
# -->
|
313
|
+
# return true if the current ractor is main ractor
|
314
|
+
#
|
315
|
+
def self.main?: () -> boolish
|
316
|
+
|
317
|
+
# <!--
|
318
|
+
# rdoc-file=ractor.rb
|
319
|
+
# - Ractor.make_shareable(obj, copy: false) -> shareable_obj
|
320
|
+
# -->
|
321
|
+
# Make `obj` shareable between ractors.
|
322
|
+
#
|
323
|
+
# `obj` and all the objects it refers to will be frozen, unless they are already
|
324
|
+
# shareable.
|
325
|
+
#
|
326
|
+
# If `copy` keyword is `true`, it will copy objects before freezing them, and
|
327
|
+
# will not modify `obj` or its internal objects.
|
328
|
+
#
|
329
|
+
# Note that the specification and implementation of this method are not mature
|
330
|
+
# and may be changed in the future.
|
331
|
+
#
|
332
|
+
# obj = ['test']
|
333
|
+
# Ractor.shareable?(obj) #=> false
|
334
|
+
# Ractor.make_shareable(obj) #=> ["test"]
|
335
|
+
# Ractor.shareable?(obj) #=> true
|
336
|
+
# obj.frozen? #=> true
|
337
|
+
# obj[0].frozen? #=> true
|
338
|
+
#
|
339
|
+
# # Copy vs non-copy versions:
|
340
|
+
# obj1 = ['test']
|
341
|
+
# obj1s = Ractor.make_shareable(obj1)
|
342
|
+
# obj1.frozen? #=> true
|
343
|
+
# obj1s.object_id == obj1.object_id #=> true
|
344
|
+
# obj2 = ['test']
|
345
|
+
# obj2s = Ractor.make_shareable(obj2, copy: true)
|
346
|
+
# obj2.frozen? #=> false
|
347
|
+
# obj2s.frozen? #=> true
|
348
|
+
# obj2s.object_id == obj2.object_id #=> false
|
349
|
+
# obj2s[0].object_id == obj2[0].object_id #=> false
|
350
|
+
#
|
351
|
+
# See also the "Shareable and unshareable objects" section in the Ractor class
|
352
|
+
# docs.
|
353
|
+
#
|
354
|
+
def self.make_shareable: [T] (T obj, ?copy: boolish) -> T
|
355
|
+
|
356
|
+
# <!--
|
357
|
+
# rdoc-file=ractor.rb
|
358
|
+
# - Ractor.new(*args, name: nil) {|*args| block } -> ractor
|
359
|
+
# -->
|
360
|
+
# Create a new Ractor with args and a block.
|
361
|
+
#
|
362
|
+
# The given block (Proc) will be isolated (can't access any outer variables).
|
363
|
+
# `self` inside the block will refer to the current Ractor.
|
364
|
+
#
|
365
|
+
# r = Ractor.new { puts "Hi, I am #{self.inspect}" }
|
366
|
+
# r.take
|
367
|
+
# # Prints "Hi, I am #<Ractor:#2 test.rb:1 running>"
|
368
|
+
#
|
369
|
+
# Any `args` passed are propagated to the block arguments by the same rules as
|
370
|
+
# objects sent via #send/Ractor.receive. If an argument in `args` is not
|
371
|
+
# shareable, it will be copied (via deep cloning, which might be inefficient).
|
372
|
+
#
|
373
|
+
# arg = [1, 2, 3]
|
374
|
+
# puts "Passing: #{arg} (##{arg.object_id})"
|
375
|
+
# r = Ractor.new(arg) {|received_arg|
|
376
|
+
# puts "Received: #{received_arg} (##{received_arg.object_id})"
|
377
|
+
# }
|
378
|
+
# r.take
|
379
|
+
# # Prints:
|
380
|
+
# # Passing: [1, 2, 3] (#280)
|
381
|
+
# # Received: [1, 2, 3] (#300)
|
382
|
+
#
|
383
|
+
# Ractor's `name` can be set for debugging purposes:
|
384
|
+
#
|
385
|
+
# r = Ractor.new(name: 'my ractor') {}; r.take
|
386
|
+
# p r
|
387
|
+
# #=> #<Ractor:#3 my ractor test.rb:1 terminated>
|
388
|
+
#
|
389
|
+
def self.new: (*untyped args, ?name: string) { (?) -> untyped } -> Ractor
|
390
|
+
|
391
|
+
# <!--
|
392
|
+
# rdoc-file=ractor.rb
|
393
|
+
# - Ractor.receive -> msg
|
394
|
+
# -->
|
395
|
+
# Receive a message from the incoming port of the current ractor (which was sent
|
396
|
+
# there by #send from another ractor).
|
397
|
+
#
|
398
|
+
# r = Ractor.new do
|
399
|
+
# v1 = Ractor.receive
|
400
|
+
# puts "Received: #{v1}"
|
401
|
+
# end
|
402
|
+
# r.send('message1')
|
403
|
+
# r.take
|
404
|
+
# # Here will be printed: "Received: message1"
|
405
|
+
#
|
406
|
+
# Alternatively, the private instance method `receive` may be used:
|
407
|
+
#
|
408
|
+
# r = Ractor.new do
|
409
|
+
# v1 = receive
|
410
|
+
# puts "Received: #{v1}"
|
411
|
+
# end
|
412
|
+
# r.send('message1')
|
413
|
+
# r.take
|
414
|
+
# # This prints: "Received: message1"
|
415
|
+
#
|
416
|
+
# The method blocks if the queue is empty.
|
417
|
+
#
|
418
|
+
# r = Ractor.new do
|
419
|
+
# puts "Before first receive"
|
420
|
+
# v1 = Ractor.receive
|
421
|
+
# puts "Received: #{v1}"
|
422
|
+
# v2 = Ractor.receive
|
423
|
+
# puts "Received: #{v2}"
|
424
|
+
# end
|
425
|
+
# wait
|
426
|
+
# puts "Still not received"
|
427
|
+
# r.send('message1')
|
428
|
+
# wait
|
429
|
+
# puts "Still received only one"
|
430
|
+
# r.send('message2')
|
431
|
+
# r.take
|
432
|
+
#
|
433
|
+
# Output:
|
434
|
+
#
|
435
|
+
# Before first receive
|
436
|
+
# Still not received
|
437
|
+
# Received: message1
|
438
|
+
# Still received only one
|
439
|
+
# Received: message2
|
440
|
+
#
|
441
|
+
# If close_incoming was called on the ractor, the method raises
|
442
|
+
# Ractor::ClosedError if there are no more messages in the incoming queue:
|
443
|
+
#
|
444
|
+
# Ractor.new do
|
445
|
+
# close_incoming
|
446
|
+
# receive
|
447
|
+
# end
|
448
|
+
# wait
|
449
|
+
# # in `receive': The incoming port is already closed => #<Ractor:#2 test.rb:1 running> (Ractor::ClosedError)
|
450
|
+
#
|
451
|
+
def self.receive: () -> untyped
|
452
|
+
|
453
|
+
# <!--
|
454
|
+
# rdoc-file=ractor.rb
|
455
|
+
# - Ractor.receive_if {|msg| block } -> msg
|
456
|
+
# -->
|
457
|
+
# Receive only a specific message.
|
458
|
+
#
|
459
|
+
# Instead of Ractor.receive, Ractor.receive_if can be given a pattern (or any
|
460
|
+
# filter) in a block and you can choose the messages to accept that are
|
461
|
+
# available in your ractor's incoming queue.
|
462
|
+
#
|
463
|
+
# r = Ractor.new do
|
464
|
+
# p Ractor.receive_if{|msg| msg.match?(/foo/)} #=> "foo3"
|
465
|
+
# p Ractor.receive_if{|msg| msg.match?(/bar/)} #=> "bar1"
|
466
|
+
# p Ractor.receive_if{|msg| msg.match?(/baz/)} #=> "baz2"
|
467
|
+
# end
|
468
|
+
# r << "bar1"
|
469
|
+
# r << "baz2"
|
470
|
+
# r << "foo3"
|
471
|
+
# r.take
|
472
|
+
#
|
473
|
+
# This will output:
|
474
|
+
#
|
475
|
+
# foo3
|
476
|
+
# bar1
|
477
|
+
# baz2
|
478
|
+
#
|
479
|
+
# If the block returns a truthy value, the message is removed from the incoming
|
480
|
+
# queue and returned. Otherwise, the message remains in the incoming queue and
|
481
|
+
# the next messages are checked by the given block.
|
482
|
+
#
|
483
|
+
# If there are no messages left in the incoming queue, the method will block
|
484
|
+
# until new messages arrive.
|
485
|
+
#
|
486
|
+
# If the block is escaped by break/return/exception/throw, the message is
|
487
|
+
# removed from the incoming queue as if a truthy value had been returned.
|
488
|
+
#
|
489
|
+
# r = Ractor.new do
|
490
|
+
# val = Ractor.receive_if{|msg| msg.is_a?(Array)}
|
491
|
+
# puts "Received successfully: #{val}"
|
492
|
+
# end
|
493
|
+
#
|
494
|
+
# r.send(1)
|
495
|
+
# r.send('test')
|
496
|
+
# wait
|
497
|
+
# puts "2 non-matching sent, nothing received"
|
498
|
+
# r.send([1, 2, 3])
|
499
|
+
# wait
|
500
|
+
#
|
501
|
+
# Prints:
|
502
|
+
#
|
503
|
+
# 2 non-matching sent, nothing received
|
504
|
+
# Received successfully: [1, 2, 3]
|
505
|
+
#
|
506
|
+
# Note that you can not call receive/receive_if in the given block recursively.
|
507
|
+
# You should not do any tasks in the block other than message filtration.
|
508
|
+
#
|
509
|
+
# Ractor.current << true
|
510
|
+
# Ractor.receive_if{|msg| Ractor.receive}
|
511
|
+
# #=> `receive': can not call receive/receive_if recursively (Ractor::Error)
|
512
|
+
#
|
513
|
+
def self.receive_if: () { (untyped) -> boolish } -> untyped
|
514
|
+
|
515
|
+
# <!--
|
516
|
+
# rdoc-file=ractor.rb
|
517
|
+
# - recv()
|
518
|
+
# -->
|
519
|
+
#
|
520
|
+
alias self.recv self.receive
|
521
|
+
|
522
|
+
# <!--
|
523
|
+
# rdoc-file=ractor.rb
|
524
|
+
# - Ractor.select(*ractors, [yield_value:, move: false]) -> [ractor or symbol, obj]
|
525
|
+
# -->
|
526
|
+
# Wait for any ractor to have something in its outgoing port, read from this
|
527
|
+
# ractor, and then return that ractor and the object received.
|
528
|
+
#
|
529
|
+
# r1 = Ractor.new {Ractor.yield 'from 1'}
|
530
|
+
# r2 = Ractor.new {Ractor.yield 'from 2'}
|
531
|
+
#
|
532
|
+
# r, obj = Ractor.select(r1, r2)
|
533
|
+
#
|
534
|
+
# puts "received #{obj.inspect} from #{r.inspect}"
|
535
|
+
# # Prints: received "from 1" from #<Ractor:#2 test.rb:1 running>
|
536
|
+
# # But could just as well print "from r2" here, either prints could be first.
|
537
|
+
#
|
538
|
+
# If one of the given ractors is the current ractor, and it is selected, `r`
|
539
|
+
# will contain the `:receive` symbol instead of the ractor object.
|
540
|
+
#
|
541
|
+
# r1 = Ractor.new(Ractor.current) do |main|
|
542
|
+
# main.send 'to main'
|
543
|
+
# Ractor.yield 'from 1'
|
544
|
+
# end
|
545
|
+
# r2 = Ractor.new do
|
546
|
+
# Ractor.yield 'from 2'
|
547
|
+
# end
|
548
|
+
#
|
549
|
+
# r, obj = Ractor.select(r1, r2, Ractor.current)
|
550
|
+
# puts "received #{obj.inspect} from #{r.inspect}"
|
551
|
+
# # Could print: received "to main" from :receive
|
552
|
+
#
|
553
|
+
# If `yield_value` is provided, that value may be yielded if another ractor is
|
554
|
+
# calling #take. In this case, the pair `[:yield, nil]` is returned:
|
555
|
+
#
|
556
|
+
# r1 = Ractor.new(Ractor.current) do |main|
|
557
|
+
# puts "Received from main: #{main.take}"
|
558
|
+
# end
|
559
|
+
#
|
560
|
+
# puts "Trying to select"
|
561
|
+
# r, obj = Ractor.select(r1, Ractor.current, yield_value: 123)
|
562
|
+
# wait
|
563
|
+
# puts "Received #{obj.inspect} from #{r.inspect}"
|
564
|
+
#
|
565
|
+
# This will print:
|
566
|
+
#
|
567
|
+
# Trying to select
|
568
|
+
# Received from main: 123
|
569
|
+
# Received nil from :yield
|
570
|
+
#
|
571
|
+
# `move` boolean flag defines whether yielded value will be copied (default) or
|
572
|
+
# moved.
|
573
|
+
#
|
574
|
+
def self.select: (*Ractor ractors, ?move: boolish, ?yield_value: untyped) -> [ Ractor | Symbol, untyped ]
|
575
|
+
|
576
|
+
# <!--
|
577
|
+
# rdoc-file=ractor.rb
|
578
|
+
# - Ractor.shareable?(obj) -> true | false
|
579
|
+
# -->
|
580
|
+
# Checks if the object is shareable by ractors.
|
581
|
+
#
|
582
|
+
# Ractor.shareable?(1) #=> true -- numbers and other immutable basic values are frozen
|
583
|
+
# Ractor.shareable?('foo') #=> false, unless the string is frozen due to # frozen_string_literal: true
|
584
|
+
# Ractor.shareable?('foo'.freeze) #=> true
|
585
|
+
#
|
586
|
+
# See also the "Shareable and unshareable objects" section in the Ractor class
|
587
|
+
# docs.
|
588
|
+
#
|
589
|
+
def self.shareable?: (untyped obj) -> bool
|
590
|
+
|
591
|
+
# <!--
|
592
|
+
# rdoc-file=ractor.rb
|
593
|
+
# - Ractor.store_if_absent(key){ init_block }
|
594
|
+
# -->
|
595
|
+
# If the correponding value is not set, yield a value with init_block and store
|
596
|
+
# the value in thread-safe manner. This method returns corresponding stored
|
597
|
+
# value.
|
598
|
+
#
|
599
|
+
# (1..10).map{
|
600
|
+
# Thread.new(it){|i|
|
601
|
+
# Ractor.store_if_absent(:s){ f(); i }
|
602
|
+
# #=> return stored value of key :s
|
603
|
+
# }
|
604
|
+
# }.map(&:value).uniq.size #=> 1 and f() is called only once
|
605
|
+
#
|
606
|
+
def self.store_if_absent: [A] (Symbol) { (nil) -> A } -> A
|
607
|
+
|
608
|
+
# <!--
|
609
|
+
# rdoc-file=ractor.rb
|
610
|
+
# - Ractor.yield(msg, move: false) -> nil
|
611
|
+
# -->
|
612
|
+
# Send a message to the current ractor's outgoing port to be accepted by #take.
|
613
|
+
#
|
614
|
+
# r = Ractor.new {Ractor.yield 'Hello from ractor'}
|
615
|
+
# puts r.take
|
616
|
+
# # Prints: "Hello from ractor"
|
617
|
+
#
|
618
|
+
# This method is blocking, and will return only when somebody consumes the sent
|
619
|
+
# message.
|
620
|
+
#
|
621
|
+
# r = Ractor.new do
|
622
|
+
# Ractor.yield 'Hello from ractor'
|
623
|
+
# puts "Ractor: after yield"
|
624
|
+
# end
|
625
|
+
# wait
|
626
|
+
# puts "Still not taken"
|
627
|
+
# puts r.take
|
628
|
+
#
|
629
|
+
# This will print:
|
630
|
+
#
|
631
|
+
# Still not taken
|
632
|
+
# Hello from ractor
|
633
|
+
# Ractor: after yield
|
634
|
+
#
|
635
|
+
# If the outgoing port was closed with #close_outgoing, the method will raise:
|
636
|
+
#
|
637
|
+
# r = Ractor.new do
|
638
|
+
# close_outgoing
|
639
|
+
# Ractor.yield 'Hello from ractor'
|
640
|
+
# end
|
641
|
+
# wait
|
642
|
+
# # `yield': The outgoing-port is already closed (Ractor::ClosedError)
|
643
|
+
#
|
644
|
+
# The meaning of the `move` argument is the same as for #send.
|
645
|
+
#
|
646
|
+
def self.yield: (untyped obj, ?move: boolish) -> untyped
|
647
|
+
|
648
|
+
# <!--
|
649
|
+
# rdoc-file=ractor.rb
|
650
|
+
# - <<(obj, move: false)
|
651
|
+
# -->
|
652
|
+
#
|
653
|
+
alias << send
|
654
|
+
|
655
|
+
# <!--
|
656
|
+
# rdoc-file=ractor.rb
|
657
|
+
# - [](sym)
|
658
|
+
# -->
|
659
|
+
# get a value from ractor-local storage of current Ractor Obsolete and use
|
660
|
+
# Ractor.[] instead.
|
661
|
+
#
|
662
|
+
def []: (interned sym) -> untyped
|
663
|
+
|
664
|
+
# <!--
|
665
|
+
# rdoc-file=ractor.rb
|
666
|
+
# - []=(sym, val)
|
667
|
+
# -->
|
668
|
+
# set a value in ractor-local storage of current Ractor Obsolete and use
|
669
|
+
# Ractor.[]= instead.
|
670
|
+
#
|
671
|
+
def []=: [T] (interned sym, T val) -> T
|
672
|
+
|
673
|
+
# <!--
|
674
|
+
# rdoc-file=ractor.rb
|
675
|
+
# - ractor.close_incoming -> true | false
|
676
|
+
# -->
|
677
|
+
# Closes the incoming port and returns whether it was already closed. All
|
678
|
+
# further attempts to Ractor.receive in the ractor, and #send to the ractor will
|
679
|
+
# fail with Ractor::ClosedError.
|
680
|
+
#
|
681
|
+
# r = Ractor.new {sleep(500)}
|
682
|
+
# r.close_incoming #=> false
|
683
|
+
# r.close_incoming #=> true
|
684
|
+
# r.send('test')
|
685
|
+
# # Ractor::ClosedError (The incoming-port is already closed)
|
686
|
+
#
|
687
|
+
def close_incoming: () -> bool
|
688
|
+
|
689
|
+
# <!--
|
690
|
+
# rdoc-file=ractor.rb
|
691
|
+
# - ractor.close_outgoing -> true | false
|
692
|
+
# -->
|
693
|
+
# Closes the outgoing port and returns whether it was already closed. All
|
694
|
+
# further attempts to Ractor.yield in the ractor, and #take from the ractor will
|
695
|
+
# fail with Ractor::ClosedError.
|
696
|
+
#
|
697
|
+
# r = Ractor.new {sleep(500)}
|
698
|
+
# r.close_outgoing #=> false
|
699
|
+
# r.close_outgoing #=> true
|
700
|
+
# r.take
|
701
|
+
# # Ractor::ClosedError (The outgoing-port is already closed)
|
702
|
+
#
|
703
|
+
def close_outgoing: () -> bool
|
704
|
+
|
705
|
+
# <!--
|
706
|
+
# rdoc-file=ractor.rb
|
707
|
+
# - inspect()
|
708
|
+
# -->
|
709
|
+
#
|
710
|
+
def inspect: () -> String
|
711
|
+
|
712
|
+
# <!--
|
713
|
+
# rdoc-file=ractor.rb
|
714
|
+
# - name()
|
715
|
+
# -->
|
716
|
+
# The name set in Ractor.new, or `nil`.
|
717
|
+
#
|
718
|
+
def name: () -> String?
|
719
|
+
|
720
|
+
# <!--
|
721
|
+
# rdoc-file=ractor.rb
|
722
|
+
# - ractor.send(msg, move: false) -> self
|
723
|
+
# -->
|
724
|
+
# Send a message to a Ractor's incoming queue to be accepted by Ractor.receive.
|
725
|
+
#
|
726
|
+
# r = Ractor.new do
|
727
|
+
# value = Ractor.receive
|
728
|
+
# puts "Received #{value}"
|
729
|
+
# end
|
730
|
+
# r.send 'message'
|
731
|
+
# # Prints: "Received: message"
|
732
|
+
#
|
733
|
+
# The method is non-blocking (will return immediately even if the ractor is not
|
734
|
+
# ready to receive anything):
|
735
|
+
#
|
736
|
+
# r = Ractor.new {sleep(5)}
|
737
|
+
# r.send('test')
|
738
|
+
# puts "Sent successfully"
|
739
|
+
# # Prints: "Sent successfully" immediately
|
740
|
+
#
|
741
|
+
# An attempt to send to a ractor which already finished its execution will raise
|
742
|
+
# Ractor::ClosedError.
|
743
|
+
#
|
744
|
+
# r = Ractor.new {}
|
745
|
+
# r.take
|
746
|
+
# p r
|
747
|
+
# # "#<Ractor:#6 (irb):23 terminated>"
|
748
|
+
# r.send('test')
|
749
|
+
# # Ractor::ClosedError (The incoming-port is already closed)
|
750
|
+
#
|
751
|
+
# If close_incoming was called on the ractor, the method also raises
|
752
|
+
# Ractor::ClosedError.
|
753
|
+
#
|
754
|
+
# r = Ractor.new do
|
755
|
+
# sleep(500)
|
756
|
+
# receive
|
757
|
+
# end
|
758
|
+
# r.close_incoming
|
759
|
+
# r.send('test')
|
760
|
+
# # Ractor::ClosedError (The incoming-port is already closed)
|
761
|
+
# # The error is raised immediately, not when the ractor tries to receive
|
762
|
+
#
|
763
|
+
# If the `obj` is unshareable, by default it will be copied into the receiving
|
764
|
+
# ractor by deep cloning. If `move: true` is passed, the object is *moved* into
|
765
|
+
# the receiving ractor and becomes inaccessible to the sender.
|
766
|
+
#
|
767
|
+
# r = Ractor.new {puts "Received: #{receive}"}
|
768
|
+
# msg = 'message'
|
769
|
+
# r.send(msg, move: true)
|
770
|
+
# r.take
|
771
|
+
# p msg
|
772
|
+
#
|
773
|
+
# This prints:
|
774
|
+
#
|
775
|
+
# Received: message
|
776
|
+
# in `p': undefined method `inspect' for #<Ractor::MovedObject:0x000055c99b9b69b8>
|
777
|
+
#
|
778
|
+
# All references to the object and its parts will become invalid to the sender.
|
779
|
+
#
|
780
|
+
# r = Ractor.new {puts "Received: #{receive}"}
|
781
|
+
# s = 'message'
|
782
|
+
# ary = [s]
|
783
|
+
# copy = ary.dup
|
784
|
+
# r.send(ary, move: true)
|
785
|
+
#
|
786
|
+
# s.inspect
|
787
|
+
# # Ractor::MovedError (can not send any methods to a moved object)
|
788
|
+
# ary.class
|
789
|
+
# # Ractor::MovedError (can not send any methods to a moved object)
|
790
|
+
# copy.class
|
791
|
+
# # => Array, it is different object
|
792
|
+
# copy[0].inspect
|
793
|
+
# # Ractor::MovedError (can not send any methods to a moved object)
|
794
|
+
# # ...but its item was still a reference to `s`, which was moved
|
795
|
+
#
|
796
|
+
# If the object is shareable, `move: true` has no effect on it:
|
797
|
+
#
|
798
|
+
# r = Ractor.new {puts "Received: #{receive}"}
|
799
|
+
# s = 'message'.freeze
|
800
|
+
# r.send(s, move: true)
|
801
|
+
# s.inspect #=> "message", still available
|
802
|
+
#
|
803
|
+
def send: (untyped obj, ?move: boolish) -> Ractor
|
804
|
+
|
805
|
+
# <!--
|
806
|
+
# rdoc-file=ractor.rb
|
807
|
+
# - ractor.take -> msg
|
808
|
+
# -->
|
809
|
+
# Get a message from the ractor's outgoing port, which was put there by
|
810
|
+
# Ractor.yield or at ractor's termination.
|
811
|
+
#
|
812
|
+
# r = Ractor.new do
|
813
|
+
# Ractor.yield 'explicit yield'
|
814
|
+
# 'last value'
|
815
|
+
# end
|
816
|
+
# puts r.take #=> 'explicit yield'
|
817
|
+
# puts r.take #=> 'last value'
|
818
|
+
# puts r.take # Ractor::ClosedError (The outgoing-port is already closed)
|
819
|
+
#
|
820
|
+
# The fact that the last value is also sent to the outgoing port means that
|
821
|
+
# `take` can be used as an analog of Thread#join ("just wait until ractor
|
822
|
+
# finishes"). However, it will raise if somebody has already consumed that
|
823
|
+
# message.
|
824
|
+
#
|
825
|
+
# If the outgoing port was closed with #close_outgoing, the method will raise
|
826
|
+
# Ractor::ClosedError.
|
827
|
+
#
|
828
|
+
# r = Ractor.new do
|
829
|
+
# sleep(500)
|
830
|
+
# Ractor.yield 'Hello from ractor'
|
831
|
+
# end
|
832
|
+
# r.close_outgoing
|
833
|
+
# r.take
|
834
|
+
# # Ractor::ClosedError (The outgoing-port is already closed)
|
835
|
+
# # The error would be raised immediately, not when ractor will try to receive
|
836
|
+
#
|
837
|
+
# If an uncaught exception is raised in the Ractor, it is propagated by take as
|
838
|
+
# a Ractor::RemoteError.
|
839
|
+
#
|
840
|
+
# r = Ractor.new {raise "Something weird happened"}
|
841
|
+
#
|
842
|
+
# begin
|
843
|
+
# r.take
|
844
|
+
# rescue => e
|
845
|
+
# p e # => #<Ractor::RemoteError: thrown by remote Ractor.>
|
846
|
+
# p e.ractor == r # => true
|
847
|
+
# p e.cause # => #<RuntimeError: Something weird happened>
|
848
|
+
# end
|
849
|
+
#
|
850
|
+
# Ractor::ClosedError is a descendant of StopIteration, so the termination of
|
851
|
+
# the ractor will break out of any loops that receive this message without
|
852
|
+
# propagating the error:
|
853
|
+
#
|
854
|
+
# r = Ractor.new do
|
855
|
+
# 3.times {|i| Ractor.yield "message #{i}"}
|
856
|
+
# "finishing"
|
857
|
+
# end
|
858
|
+
#
|
859
|
+
# loop {puts "Received: " + r.take}
|
860
|
+
# puts "Continue successfully"
|
861
|
+
#
|
862
|
+
# This will print:
|
863
|
+
#
|
864
|
+
# Received: message 0
|
865
|
+
# Received: message 1
|
866
|
+
# Received: message 2
|
867
|
+
# Received: finishing
|
868
|
+
# Continue successfully
|
869
|
+
#
|
870
|
+
def take: () -> untyped
|
871
|
+
|
872
|
+
# <!--
|
873
|
+
# rdoc-file=ractor.rb
|
874
|
+
# - to_s()
|
875
|
+
# -->
|
876
|
+
#
|
877
|
+
alias to_s inspect
|
878
|
+
|
879
|
+
private
|
880
|
+
|
881
|
+
# <!--
|
882
|
+
# rdoc-file=ractor.rb
|
883
|
+
# - receive()
|
884
|
+
# -->
|
885
|
+
# same as Ractor.receive
|
886
|
+
#
|
887
|
+
def receive: () -> untyped
|
888
|
+
|
889
|
+
# <!--
|
890
|
+
# rdoc-file=ractor.rb
|
891
|
+
# - receive_if(&b)
|
892
|
+
# -->
|
893
|
+
# same as Ractor.receive_if
|
894
|
+
#
|
895
|
+
def receive_if: () { (untyped) -> boolish } -> untyped
|
896
|
+
|
897
|
+
# <!--
|
898
|
+
# rdoc-file=ractor.rb
|
899
|
+
# - recv()
|
900
|
+
# -->
|
901
|
+
#
|
902
|
+
alias recv receive
|
903
|
+
|
904
|
+
# <!-- rdoc-file=ractor.c -->
|
905
|
+
# Raised when an attempt is made to send a message to a closed port, or to
|
906
|
+
# retrieve a message from a closed and empty port. Ports may be closed
|
907
|
+
# explicitly with Ractor#close_outgoing/close_incoming and are closed implicitly
|
908
|
+
# when a Ractor terminates.
|
909
|
+
#
|
910
|
+
# r = Ractor.new { sleep(500) }
|
911
|
+
# r.close_outgoing
|
912
|
+
# r.take # Ractor::ClosedError
|
913
|
+
#
|
914
|
+
# ClosedError is a descendant of StopIteration, so the closing of the ractor
|
915
|
+
# will break the loops without propagating the error:
|
916
|
+
#
|
917
|
+
# r = Ractor.new do
|
918
|
+
# loop do
|
919
|
+
# msg = receive # raises ClosedError and loop traps it
|
920
|
+
# puts "Received: #{msg}"
|
921
|
+
# end
|
922
|
+
# puts "loop exited"
|
923
|
+
# end
|
924
|
+
#
|
925
|
+
# 3.times{|i| r << i}
|
926
|
+
# r.close_incoming
|
927
|
+
# r.take
|
928
|
+
# puts "Continue successfully"
|
929
|
+
#
|
930
|
+
# This will print:
|
931
|
+
#
|
932
|
+
# Received: 0
|
933
|
+
# Received: 1
|
934
|
+
# Received: 2
|
935
|
+
# loop exited
|
936
|
+
# Continue successfully
|
937
|
+
#
|
938
|
+
class ClosedError < StopIteration
|
939
|
+
end
|
940
|
+
|
941
|
+
class Error < RuntimeError
|
942
|
+
end
|
943
|
+
|
944
|
+
class IsolationError < Ractor::Error
|
945
|
+
end
|
946
|
+
|
947
|
+
# <!-- rdoc-file=ractor.c -->
|
948
|
+
# Raised on an attempt to access an object which was moved in Ractor#send or
|
949
|
+
# Ractor.yield.
|
950
|
+
#
|
951
|
+
# r = Ractor.new { sleep }
|
952
|
+
#
|
953
|
+
# ary = [1, 2, 3]
|
954
|
+
# r.send(ary, move: true)
|
955
|
+
# ary.inspect
|
956
|
+
# # Ractor::MovedError (can not send any methods to a moved object)
|
957
|
+
#
|
958
|
+
class MovedError < Ractor::Error
|
959
|
+
end
|
960
|
+
|
961
|
+
# <!-- rdoc-file=ractor.c -->
|
962
|
+
# A special object which replaces any value that was moved to another ractor in
|
963
|
+
# Ractor#send or Ractor.yield. Any attempt to access the object results in
|
964
|
+
# Ractor::MovedError.
|
965
|
+
#
|
966
|
+
# r = Ractor.new { receive }
|
967
|
+
#
|
968
|
+
# ary = [1, 2, 3]
|
969
|
+
# r.send(ary, move: true)
|
970
|
+
# p Ractor::MovedObject === ary
|
971
|
+
# # => true
|
972
|
+
# ary.inspect
|
973
|
+
# # Ractor::MovedError (can not send any methods to a moved object)
|
974
|
+
#
|
975
|
+
class MovedObject < BasicObject
|
976
|
+
# <!--
|
977
|
+
# rdoc-file=ractor.c
|
978
|
+
# - !(*args)
|
979
|
+
# -->
|
980
|
+
#
|
981
|
+
def !: (*untyped) -> untyped
|
982
|
+
|
983
|
+
# <!--
|
984
|
+
# rdoc-file=ractor.c
|
985
|
+
# - !=(*args)
|
986
|
+
# -->
|
987
|
+
#
|
988
|
+
def !=: (*untyped) -> untyped
|
989
|
+
|
990
|
+
# <!--
|
991
|
+
# rdoc-file=ractor.c
|
992
|
+
# - ==(*args)
|
993
|
+
# -->
|
994
|
+
#
|
995
|
+
def ==: (*untyped) -> untyped
|
996
|
+
|
997
|
+
# <!--
|
998
|
+
# rdoc-file=ractor.c
|
999
|
+
# - __id__(*args)
|
1000
|
+
# -->
|
1001
|
+
#
|
1002
|
+
def __id__: (*untyped) -> untyped
|
1003
|
+
|
1004
|
+
# <!--
|
1005
|
+
# rdoc-file=ractor.c
|
1006
|
+
# - __send__(*args)
|
1007
|
+
# -->
|
1008
|
+
#
|
1009
|
+
def __send__: (*untyped) -> untyped
|
1010
|
+
|
1011
|
+
# <!--
|
1012
|
+
# rdoc-file=ractor.c
|
1013
|
+
# - equal?(*args)
|
1014
|
+
# -->
|
1015
|
+
#
|
1016
|
+
def equal?: (*untyped) -> untyped
|
1017
|
+
|
1018
|
+
# <!--
|
1019
|
+
# rdoc-file=ractor.c
|
1020
|
+
# - instance_eval(*args)
|
1021
|
+
# -->
|
1022
|
+
#
|
1023
|
+
def instance_eval: (*untyped) -> untyped
|
1024
|
+
|
1025
|
+
# <!--
|
1026
|
+
# rdoc-file=ractor.c
|
1027
|
+
# - instance_exec(*args)
|
1028
|
+
# -->
|
1029
|
+
#
|
1030
|
+
def instance_exec: (*untyped) -> untyped
|
1031
|
+
|
1032
|
+
# <!--
|
1033
|
+
# rdoc-file=ractor.c
|
1034
|
+
# - method_missing(*args)
|
1035
|
+
# -->
|
1036
|
+
#
|
1037
|
+
def method_missing: (*untyped) -> untyped
|
1038
|
+
end
|
1039
|
+
|
1040
|
+
# <!-- rdoc-file=ractor.c -->
|
1041
|
+
# Raised on attempt to Ractor#take if there was an uncaught exception in the
|
1042
|
+
# Ractor. Its `cause` will contain the original exception, and `ractor` is the
|
1043
|
+
# original ractor it was raised in.
|
1044
|
+
#
|
1045
|
+
# r = Ractor.new { raise "Something weird happened" }
|
1046
|
+
#
|
1047
|
+
# begin
|
1048
|
+
# r.take
|
1049
|
+
# rescue => e
|
1050
|
+
# p e # => #<Ractor::RemoteError: thrown by remote Ractor.>
|
1051
|
+
# p e.ractor == r # => true
|
1052
|
+
# p e.cause # => #<RuntimeError: Something weird happened>
|
1053
|
+
# end
|
1054
|
+
#
|
1055
|
+
class RemoteError < Ractor::Error
|
1056
|
+
# <!-- rdoc-file=ractor.rb -->
|
1057
|
+
# The Ractor an uncaught exception is raised in.
|
1058
|
+
#
|
1059
|
+
def ractor: () -> Ractor
|
1060
|
+
end
|
1061
|
+
|
1062
|
+
class UnsafeError < Ractor::Error
|
1063
|
+
end
|
1064
|
+
|
1065
|
+
%a{annotate:rdoc:skip}
|
1066
|
+
class Selector
|
1067
|
+
end
|
1068
|
+
end
|