rkoans 0.0.1 → 0.1.0
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 +4 -4
- data/CHANGELOG.md +13 -0
- data/CURRICULUM.md +86 -0
- data/README.md +77 -0
- data/THIRD_PARTY_NOTICES.md +30 -0
- data/exercises/about-array-assignment/about_array_assignment.rb +45 -0
- data/exercises/about-array-assignment/brief.md +11 -0
- data/exercises/about-array-assignment/hint.md +11 -0
- data/exercises/about-arrays/about_arrays.rb +77 -0
- data/exercises/about-arrays/brief.md +16 -0
- data/exercises/about-arrays/hint.md +13 -0
- data/exercises/about-asserts/about_asserts.rb +22 -0
- data/exercises/about-asserts/brief.md +22 -0
- data/exercises/about-asserts/hint.md +10 -0
- data/exercises/about-blocks/about_blocks.rb +76 -0
- data/exercises/about-blocks/brief.md +44 -0
- data/exercises/about-blocks/hint.md +7 -0
- data/exercises/about-class-methods/about_class_methods.rb +105 -0
- data/exercises/about-class-methods/brief.md +73 -0
- data/exercises/about-class-methods/hint.md +8 -0
- data/exercises/about-classes/about_classes.rb +131 -0
- data/exercises/about-classes/brief.md +73 -0
- data/exercises/about-classes/hint.md +7 -0
- data/exercises/about-constants/about_constants.rb +49 -0
- data/exercises/about-constants/brief.md +51 -0
- data/exercises/about-constants/hint.md +7 -0
- data/exercises/about-control-statements/about_control_statements.rb +152 -0
- data/exercises/about-control-statements/brief.md +9 -0
- data/exercises/about-control-statements/hint.md +7 -0
- data/exercises/about-dice-project/about_dice_project.rb +27 -0
- data/exercises/about-dice-project/brief.md +12 -0
- data/exercises/about-dice-project/hint.md +5 -0
- data/exercises/about-exceptions/about_exceptions.rb +84 -0
- data/exercises/about-exceptions/brief.md +19 -0
- data/exercises/about-exceptions/hint.md +8 -0
- data/exercises/about-extra-credit/about_extra_credit.rb +117 -0
- data/exercises/about-extra-credit/brief.md +28 -0
- data/exercises/about-extra-credit/hint.md +5 -0
- data/exercises/about-hashes/about_hashes.rb +160 -0
- data/exercises/about-hashes/brief.md +9 -0
- data/exercises/about-hashes/hint.md +8 -0
- data/exercises/about-inheritance/about_inheritance.rb +63 -0
- data/exercises/about-inheritance/brief.md +50 -0
- data/exercises/about-inheritance/hint.md +8 -0
- data/exercises/about-iteration/about_iteration.rb +96 -0
- data/exercises/about-iteration/brief.md +26 -0
- data/exercises/about-iteration/hint.md +6 -0
- data/exercises/about-keyword-arguments/about_keyword_arguments.rb +56 -0
- data/exercises/about-keyword-arguments/brief.md +28 -0
- data/exercises/about-keyword-arguments/hint.md +7 -0
- data/exercises/about-message-passing/about_message_passing.rb +112 -0
- data/exercises/about-message-passing/brief.md +59 -0
- data/exercises/about-message-passing/hint.md +8 -0
- data/exercises/about-methods/about_methods.rb +104 -0
- data/exercises/about-methods/brief.md +55 -0
- data/exercises/about-methods/hint.md +8 -0
- data/exercises/about-modules/about_modules.rb +43 -0
- data/exercises/about-modules/brief.md +44 -0
- data/exercises/about-modules/hint.md +8 -0
- data/exercises/about-nil/about_nil.rb +29 -0
- data/exercises/about-nil/brief.md +12 -0
- data/exercises/about-nil/hint.md +11 -0
- data/exercises/about-objects/about_objects.rb +51 -0
- data/exercises/about-objects/brief.md +14 -0
- data/exercises/about-objects/hint.md +12 -0
- data/exercises/about-open-classes/about_open_classes.rb +38 -0
- data/exercises/about-open-classes/brief.md +34 -0
- data/exercises/about-open-classes/hint.md +7 -0
- data/exercises/about-pattern-matching/about_pattern_matching.rb +106 -0
- data/exercises/about-pattern-matching/brief.md +124 -0
- data/exercises/about-pattern-matching/hint.md +8 -0
- data/exercises/about-proxy-object-project/about_proxy_object_project.rb +43 -0
- data/exercises/about-proxy-object-project/brief.md +10 -0
- data/exercises/about-proxy-object-project/hint.md +5 -0
- data/exercises/about-regular-expressions/about_regular_expressions.rb +174 -0
- data/exercises/about-regular-expressions/brief.md +9 -0
- data/exercises/about-regular-expressions/hint.md +8 -0
- data/exercises/about-sandwich-code/about_sandwich_code.rb +58 -0
- data/exercises/about-sandwich-code/brief.md +14 -0
- data/exercises/about-sandwich-code/hint.md +5 -0
- data/exercises/about-scope/about_scope.rb +76 -0
- data/exercises/about-scope/brief.md +35 -0
- data/exercises/about-scope/hint.md +8 -0
- data/exercises/about-scoring-project/about_scoring_project.rb +16 -0
- data/exercises/about-scoring-project/brief.md +10 -0
- data/exercises/about-scoring-project/hint.md +5 -0
- data/exercises/about-strings/about_strings.rb +142 -0
- data/exercises/about-strings/brief.md +22 -0
- data/exercises/about-strings/hint.md +11 -0
- data/exercises/about-symbols/about_symbols.rb +53 -0
- data/exercises/about-symbols/brief.md +21 -0
- data/exercises/about-symbols/hint.md +12 -0
- data/exercises/about-to-str/about_to_str.rb +49 -0
- data/exercises/about-to-str/brief.md +37 -0
- data/exercises/about-to-str/hint.md +7 -0
- data/exercises/about-triangle-project/about_triangle_project.rb +15 -0
- data/exercises/about-triangle-project/brief.md +11 -0
- data/exercises/about-triangle-project/hint.md +5 -0
- data/exercises/about-triangle-project-two/about_triangle_project_two.rb +22 -0
- data/exercises/about-triangle-project-two/brief.md +10 -0
- data/exercises/about-triangle-project-two/hint.md +5 -0
- data/exercises/about-true-and-false/about_true_and_false.rb +26 -0
- data/exercises/about-true-and-false/brief.md +22 -0
- data/exercises/about-true-and-false/hint.md +7 -0
- data/exercises/blocks-and-methods/blocks_and_methods.rb +14 -0
- data/exercises/blocks-and-methods/brief.md +8 -0
- data/exercises/blocks-and-methods/hint.md +6 -0
- data/exercises/catalog.json +61 -0
- data/exercises/class-state/brief.md +8 -0
- data/exercises/class-state/class_state.rb +39 -0
- data/exercises/class-state/hint.md +5 -0
- data/exercises/closure-capture/brief.md +8 -0
- data/exercises/closure-capture/closure_capture.rb +21 -0
- data/exercises/closure-capture/hint.md +5 -0
- data/exercises/collection-basics/brief.md +8 -0
- data/exercises/collection-basics/collection_basics.rb +16 -0
- data/exercises/collection-basics/hint.md +6 -0
- data/exercises/constant-scope/brief.md +8 -0
- data/exercises/constant-scope/constant_scope.rb +18 -0
- data/exercises/constant-scope/hint.md +5 -0
- data/exercises/core-protocols/brief.md +8 -0
- data/exercises/core-protocols/core_protocols.rb +43 -0
- data/exercises/core-protocols/hint.md +5 -0
- data/exercises/delegation/brief.md +8 -0
- data/exercises/delegation/delegation.rb +20 -0
- data/exercises/delegation/hint.md +5 -0
- data/exercises/dynamic-methods/brief.md +8 -0
- data/exercises/dynamic-methods/dynamic_methods.rb +33 -0
- data/exercises/dynamic-methods/hint.md +5 -0
- data/exercises/exception-flow/brief.md +8 -0
- data/exercises/exception-flow/exception_flow.rb +27 -0
- data/exercises/exception-flow/hint.md +5 -0
- data/exercises/heredoc-layout/brief.md +14 -0
- data/exercises/heredoc-layout/heredoc_layout.rb +25 -0
- data/exercises/heredoc-layout/hint.md +9 -0
- data/exercises/keyword-forwarding/brief.md +8 -0
- data/exercises/keyword-forwarding/hint.md +5 -0
- data/exercises/keyword-forwarding/keyword_forwarding.rb +27 -0
- data/exercises/lazy-enumeration/brief.md +8 -0
- data/exercises/lazy-enumeration/hint.md +5 -0
- data/exercises/lazy-enumeration/lazy_enumeration.rb +16 -0
- data/exercises/literals-and-operators/brief.md +20 -0
- data/exercises/literals-and-operators/hint.md +5 -0
- data/exercises/literals-and-operators/literals_and_operators.rb +15 -0
- data/exercises/method-contracts/brief.md +8 -0
- data/exercises/method-contracts/hint.md +5 -0
- data/exercises/method-contracts/method_contracts.rb +22 -0
- data/exercises/method-lookup/brief.md +8 -0
- data/exercises/method-lookup/hint.md +5 -0
- data/exercises/method-lookup/method_lookup.rb +26 -0
- data/exercises/nonlocal-exit/brief.md +8 -0
- data/exercises/nonlocal-exit/hint.md +5 -0
- data/exercises/nonlocal-exit/nonlocal_exit.rb +29 -0
- data/exercises/numbered-parameters/brief.md +18 -0
- data/exercises/numbered-parameters/hint.md +5 -0
- data/exercises/numbered-parameters/numbered_parameters.rb +18 -0
- data/exercises/numeric-precision/brief.md +8 -0
- data/exercises/numeric-precision/hint.md +5 -0
- data/exercises/numeric-precision/numeric_precision.rb +17 -0
- data/exercises/pattern-matching/brief.md +8 -0
- data/exercises/pattern-matching/hint.md +5 -0
- data/exercises/pattern-matching/pattern_matching.rb +22 -0
- data/exercises/refinement-scope/brief.md +8 -0
- data/exercises/refinement-scope/hint.md +5 -0
- data/exercises/refinement-scope/refinement_scope.rb +33 -0
- data/exercises/regexp-captures/brief.md +8 -0
- data/exercises/regexp-captures/hint.md +5 -0
- data/exercises/regexp-captures/regexp_captures.rb +25 -0
- data/exercises/runtime-context/brief.md +20 -0
- data/exercises/runtime-context/hint.md +8 -0
- data/exercises/runtime-context/runtime_context.rb +11 -0
- data/exercises/shared-rows/brief.md +8 -0
- data/exercises/shared-rows/hint.md +7 -0
- data/exercises/shared-rows/shared_rows.rb +13 -0
- data/exercises/singleton-pattern/brief.md +8 -0
- data/exercises/singleton-pattern/hint.md +5 -0
- data/exercises/singleton-pattern/singleton_pattern.rb +20 -0
- data/exercises/time-and-date/brief.md +8 -0
- data/exercises/time-and-date/hint.md +5 -0
- data/exercises/time-and-date/time_and_date.rb +21 -0
- data/exercises/visibility/brief.md +8 -0
- data/exercises/visibility/hint.md +5 -0
- data/exercises/visibility/visibility.rb +32 -0
- data/lib/rkoans/catalog.rb +31 -0
- data/lib/rkoans/checker.rb +62 -0
- data/lib/rkoans/cli.rb +79 -0
- data/lib/rkoans/error.rb +6 -0
- data/lib/rkoans/exercise.rb +50 -0
- data/lib/rkoans/keyboard.rb +51 -0
- data/lib/rkoans/progress.rb +39 -0
- data/lib/rkoans/selection.rb +31 -0
- data/lib/rkoans/session.rb +127 -0
- data/lib/rkoans/terminal_view.rb +99 -0
- data/lib/rkoans/version.rb +1 -1
- data/lib/rkoans/watcher.rb +58 -0
- data/lib/rkoans.rb +13 -3
- data/sig/about_array_assignment_acceptance_test.rbs +3 -0
- data/sig/about_arrays_acceptance_test.rbs +3 -0
- data/sig/about_asserts_command_test.rbs +4 -0
- data/sig/about_blocks_acceptance_test.rbs +3 -0
- data/sig/about_class_methods_acceptance_test.rbs +3 -0
- data/sig/about_classes_acceptance_test.rbs +3 -0
- data/sig/about_constants_acceptance_test.rbs +3 -0
- data/sig/about_control_statements_acceptance_test.rbs +3 -0
- data/sig/about_dice_project_acceptance_test.rbs +3 -0
- data/sig/about_exceptions_acceptance_test.rbs +3 -0
- data/sig/about_extra_credit_acceptance_test.rbs +5 -0
- data/sig/about_hashes_acceptance_test.rbs +3 -0
- data/sig/about_inheritance_acceptance_test.rbs +3 -0
- data/sig/about_iteration_acceptance_test.rbs +3 -0
- data/sig/about_keyword_arguments_acceptance_test.rbs +3 -0
- data/sig/about_message_passing_acceptance_test.rbs +3 -0
- data/sig/about_methods_acceptance_test.rbs +3 -0
- data/sig/about_modules_acceptance_test.rbs +3 -0
- data/sig/about_nil_acceptance_test.rbs +3 -0
- data/sig/about_objects_acceptance_test.rbs +3 -0
- data/sig/about_open_classes_acceptance_test.rbs +3 -0
- data/sig/about_pattern_matching_acceptance_test.rbs +3 -0
- data/sig/about_proxy_object_project_acceptance_test.rbs +3 -0
- data/sig/about_regular_expressions_acceptance_test.rbs +3 -0
- data/sig/about_sandwich_code_acceptance_test.rbs +3 -0
- data/sig/about_scope_acceptance_test.rbs +3 -0
- data/sig/about_scoring_project_acceptance_test.rbs +3 -0
- data/sig/about_strings_acceptance_test.rbs +3 -0
- data/sig/about_symbols_acceptance_test.rbs +3 -0
- data/sig/about_to_str_acceptance_test.rbs +3 -0
- data/sig/about_triangle_project_acceptance_test.rbs +3 -0
- data/sig/about_triangle_project_two_acceptance_test.rbs +3 -0
- data/sig/about_true_and_false_command_test.rbs +4 -0
- data/sig/catalog_error_command_test.rbs +4 -0
- data/sig/checker_test.rbs +9 -0
- data/sig/class_state_acceptance_test.rbs +3 -0
- data/sig/closure_capture_acceptance_test.rbs +3 -0
- data/sig/command_support.rbs +18 -0
- data/sig/command_test.rbs +5 -0
- data/sig/constant_scope_acceptance_test.rbs +3 -0
- data/sig/core_protocols_acceptance_test.rbs +3 -0
- data/sig/curriculum_cop_test.rbs +9 -0
- data/sig/delegation_acceptance_test.rbs +3 -0
- data/sig/dynamic_methods_acceptance_test.rbs +3 -0
- data/sig/exception_flow_acceptance_test.rbs +3 -0
- data/sig/exercise_test.rbs +3 -0
- data/sig/exercises/about_array_assignment.rbs +36 -0
- data/sig/exercises/about_arrays.rbs +51 -0
- data/sig/exercises/about_asserts.rbs +23 -0
- data/sig/exercises/about_blocks.rbs +40 -0
- data/sig/exercises/about_class_methods.rbs +62 -0
- data/sig/exercises/about_classes.rbs +88 -0
- data/sig/exercises/about_constants.rbs +53 -0
- data/sig/exercises/about_control_statements.rbs +46 -0
- data/sig/exercises/about_dice_project.rbs +16 -0
- data/sig/exercises/about_exceptions.rbs +36 -0
- data/sig/exercises/about_extra_credit.rbs +36 -0
- data/sig/exercises/about_hashes.rbs +62 -0
- data/sig/exercises/about_inheritance.rbs +50 -0
- data/sig/exercises/about_iteration.rbs +37 -0
- data/sig/exercises/about_keyword_arguments.rbs +33 -0
- data/sig/exercises/about_message_passing.rbs +68 -0
- data/sig/exercises/about_methods.rbs +68 -0
- data/sig/exercises/about_modules.rbs +38 -0
- data/sig/exercises/about_nil.rbs +23 -0
- data/sig/exercises/about_objects.rbs +38 -0
- data/sig/exercises/about_open_classes.rbs +31 -0
- data/sig/exercises/about_pattern_matching.rbs +65 -0
- data/sig/exercises/about_proxy_object_project.rbs +31 -0
- data/sig/exercises/about_regular_expressions.rbs +83 -0
- data/sig/exercises/about_sandwich_code.rbs +17 -0
- data/sig/exercises/about_scope.rbs +59 -0
- data/sig/exercises/about_scoring_project.rbs +16 -0
- data/sig/exercises/about_strings.rbs +85 -0
- data/sig/exercises/about_symbols.rbs +46 -0
- data/sig/exercises/about_to_str.rbs +36 -0
- data/sig/exercises/about_triangle_project.rbs +11 -0
- data/sig/exercises/about_triangle_project_two.rbs +12 -0
- data/sig/exercises/about_true_and_false.rbs +27 -0
- data/sig/exercises/blocks_and_methods.rbs +11 -0
- data/sig/exercises/class_state.rbs +19 -0
- data/sig/exercises/closure_capture.rbs +10 -0
- data/sig/exercises/collection_basics.rbs +6 -0
- data/sig/exercises/collection_basics_test.rbs +4 -0
- data/sig/exercises/constant_scope.rbs +11 -0
- data/sig/exercises/core_protocols.rbs +20 -0
- data/sig/exercises/delegation.rbs +14 -0
- data/sig/exercises/dynamic_methods.rbs +13 -0
- data/sig/exercises/exception_flow.rbs +11 -0
- data/sig/exercises/heredoc_layout.rbs +11 -0
- data/sig/exercises/keyword_forwarding.rbs +12 -0
- data/sig/exercises/lazy_enumeration.rbs +10 -0
- data/sig/exercises/literals_and_operators.rbs +12 -0
- data/sig/exercises/method_contracts.rbs +11 -0
- data/sig/exercises/method_lookup.rbs +16 -0
- data/sig/exercises/nonlocal_exit.rbs +14 -0
- data/sig/exercises/numbered_parameters.rbs +11 -0
- data/sig/exercises/numeric_precision.rbs +11 -0
- data/sig/exercises/pattern_matching.rbs +10 -0
- data/sig/exercises/refinement_scope.rbs +18 -0
- data/sig/exercises/regexp_captures.rbs +11 -0
- data/sig/exercises/runtime_context.rbs +23 -0
- data/sig/exercises/shared_rows.rbs +11 -0
- data/sig/exercises/singleton_pattern.rbs +14 -0
- data/sig/exercises/time_and_date.rbs +11 -0
- data/sig/exercises/visibility.rbs +18 -0
- data/sig/fixture_support.rbs +11 -0
- data/sig/help_hint_command_test.rbs +8 -0
- data/sig/heredoc_layout_acceptance_test.rbs +3 -0
- data/sig/keyboard_session_test.rbs +9 -0
- data/sig/keyword_forwarding_acceptance_test.rbs +3 -0
- data/sig/lazy_enumeration_acceptance_test.rbs +3 -0
- data/sig/literals_and_operators_acceptance_test.rbs +3 -0
- data/sig/method_contracts_acceptance_test.rbs +3 -0
- data/sig/method_lookup_acceptance_test.rbs +3 -0
- data/sig/nonlocal_exit_acceptance_test.rbs +3 -0
- data/sig/numbered_parameters_acceptance_test.rbs +3 -0
- data/sig/numeric_precision_acceptance_test.rbs +4 -0
- data/sig/packaging_test.rbs +3 -0
- data/sig/pattern_matching_acceptance_test.rbs +3 -0
- data/sig/reference_solutions_test.rbs +3 -0
- data/sig/refinement_scope_acceptance_test.rbs +3 -0
- data/sig/regexp_captures_acceptance_test.rbs +4 -0
- data/sig/rkoans/catalog.rbs +11 -0
- data/sig/rkoans/checker.rbs +22 -0
- data/sig/rkoans/cli.rbs +21 -0
- data/sig/rkoans/exercise.rbs +18 -0
- data/sig/rkoans/keyboard.rbs +13 -0
- data/sig/rkoans/progress.rbs +9 -0
- data/sig/rkoans/selection.rbs +9 -0
- data/sig/rkoans/session.rbs +30 -0
- data/sig/rkoans/terminal_view.rbs +24 -0
- data/sig/rkoans/watcher.rbs +18 -0
- data/sig/rkoans.rbs +2 -0
- data/sig/runtime_context_command_test.rbs +4 -0
- data/sig/selection_command_test.rbs +5 -0
- data/sig/session_command_test.rbs +12 -0
- data/sig/session_edge_cases_test.rbs +4 -0
- data/sig/shared_rows_acceptance_test.rbs +3 -0
- data/sig/singleton_pattern_acceptance_test.rbs +3 -0
- data/sig/time_and_date_acceptance_test.rbs +4 -0
- data/sig/visibility_acceptance_test.rbs +4 -0
- data/sig/watcher_test.rbs +3 -0
- data/solutions/about-array-assignment/about_array_assignment.rb +36 -0
- data/solutions/about-arrays/about_arrays.rb +53 -0
- data/solutions/about-asserts/about_asserts.rb +22 -0
- data/solutions/about-blocks/about_blocks.rb +30 -0
- data/solutions/about-class-methods/about_class_methods.rb +36 -0
- data/solutions/about-classes/about_classes.rb +40 -0
- data/solutions/about-constants/about_constants.rb +26 -0
- data/solutions/about-control-statements/about_control_statements.rb +35 -0
- data/solutions/about-dice-project/about_dice_project.rb +27 -0
- data/solutions/about-exceptions/about_exceptions.rb +30 -0
- data/solutions/about-extra-credit/about_extra_credit.rb +114 -0
- data/solutions/about-hashes/about_hashes.rb +52 -0
- data/solutions/about-inheritance/about_inheritance.rb +27 -0
- data/solutions/about-iteration/about_iteration.rb +31 -0
- data/solutions/about-keyword-arguments/about_keyword_arguments.rb +28 -0
- data/solutions/about-message-passing/about_message_passing.rb +38 -0
- data/solutions/about-methods/about_methods.rb +39 -0
- data/solutions/about-modules/about_modules.rb +23 -0
- data/solutions/about-nil/about_nil.rb +23 -0
- data/solutions/about-objects/about_objects.rb +34 -0
- data/solutions/about-open-classes/about_open_classes.rb +23 -0
- data/solutions/about-pattern-matching/about_pattern_matching.rb +39 -0
- data/solutions/about-proxy-object-project/about_proxy_object_project.rb +44 -0
- data/solutions/about-regular-expressions/about_regular_expressions.rb +60 -0
- data/solutions/about-sandwich-code/about_sandwich_code.rb +60 -0
- data/solutions/about-scope/about_scope.rb +33 -0
- data/solutions/about-scoring-project/about_scoring_project.rb +19 -0
- data/solutions/about-strings/about_strings.rb +56 -0
- data/solutions/about-symbols/about_symbols.rb +35 -0
- data/solutions/about-to-str/about_to_str.rb +24 -0
- data/solutions/about-triangle-project/about_triangle_project.rb +19 -0
- data/solutions/about-triangle-project-two/about_triangle_project_two.rb +25 -0
- data/solutions/about-true-and-false/about_true_and_false.rb +25 -0
- data/solutions/blocks-and-methods/blocks_and_methods.rb +14 -0
- data/solutions/class-state/class_state.rb +33 -0
- data/solutions/closure-capture/closure_capture.rb +12 -0
- data/solutions/collection-basics/collection_basics.rb +14 -0
- data/solutions/constant-scope/constant_scope.rb +18 -0
- data/solutions/core-protocols/core_protocols.rb +44 -0
- data/solutions/delegation/delegation.rb +17 -0
- data/solutions/dynamic-methods/dynamic_methods.rb +32 -0
- data/solutions/exception-flow/exception_flow.rb +34 -0
- data/solutions/heredoc-layout/heredoc_layout.rb +24 -0
- data/solutions/keyword-forwarding/keyword_forwarding.rb +26 -0
- data/solutions/lazy-enumeration/lazy_enumeration.rb +11 -0
- data/solutions/literals-and-operators/literals_and_operators.rb +22 -0
- data/solutions/method-contracts/method_contracts.rb +18 -0
- data/solutions/method-lookup/method_lookup.rb +26 -0
- data/solutions/nonlocal-exit/nonlocal_exit.rb +46 -0
- data/solutions/numbered-parameters/numbered_parameters.rb +18 -0
- data/solutions/numeric-precision/numeric_precision.rb +17 -0
- data/solutions/pattern-matching/pattern_matching.rb +17 -0
- data/solutions/refinement-scope/refinement_scope.rb +34 -0
- data/solutions/regexp-captures/regexp_captures.rb +24 -0
- data/solutions/runtime-context/runtime_context.rb +19 -0
- data/solutions/shared-rows/shared_rows.rb +13 -0
- data/solutions/singleton-pattern/singleton_pattern.rb +19 -0
- data/solutions/time-and-date/time_and_date.rb +16 -0
- data/solutions/visibility/visibility.rb +34 -0
- data/test/exercises/about_array_assignment_test.rb +87 -0
- data/test/exercises/about_arrays_test.rb +119 -0
- data/test/exercises/about_asserts_test.rb +41 -0
- data/test/exercises/about_blocks_test.rb +140 -0
- data/test/exercises/about_class_methods_test.rb +232 -0
- data/test/exercises/about_classes_test.rb +261 -0
- data/test/exercises/about_constants_test.rb +111 -0
- data/test/exercises/about_control_statements_test.rb +188 -0
- data/test/exercises/about_dice_project_test.rb +40 -0
- data/test/exercises/about_exceptions_test.rb +98 -0
- data/test/exercises/about_extra_credit_test.rb +74 -0
- data/test/exercises/about_hashes_test.rb +163 -0
- data/test/exercises/about_inheritance_test.rb +121 -0
- data/test/exercises/about_iteration_test.rb +148 -0
- data/test/exercises/about_keyword_arguments_test.rb +80 -0
- data/test/exercises/about_message_passing_test.rb +230 -0
- data/test/exercises/about_methods_test.rb +208 -0
- data/test/exercises/about_modules_test.rb +98 -0
- data/test/exercises/about_nil_test.rb +35 -0
- data/test/exercises/about_objects_test.rb +74 -0
- data/test/exercises/about_open_classes_test.rb +60 -0
- data/test/exercises/about_pattern_matching_test.rb +257 -0
- data/test/exercises/about_proxy_object_project_test.rb +75 -0
- data/test/exercises/about_regular_expressions_test.rb +243 -0
- data/test/exercises/about_sandwich_code_test.rb +82 -0
- data/test/exercises/about_scope_test.rb +123 -0
- data/test/exercises/about_scoring_project_test.rb +62 -0
- data/test/exercises/about_strings_test.rb +255 -0
- data/test/exercises/about_symbols_test.rb +120 -0
- data/test/exercises/about_to_str_test.rb +89 -0
- data/test/exercises/about_triangle_project_test.rb +29 -0
- data/test/exercises/about_triangle_project_two_test.rb +28 -0
- data/test/exercises/about_true_and_false_test.rb +43 -0
- data/test/exercises/blocks_and_methods_test.rb +22 -0
- data/test/exercises/class_state_test.rb +29 -0
- data/test/exercises/closure_capture_test.rb +29 -0
- data/test/exercises/collection_basics_test.rb +18 -0
- data/test/exercises/constant_scope_test.rb +18 -0
- data/test/exercises/core_protocols_test.rb +28 -0
- data/test/exercises/delegation_test.rb +23 -0
- data/test/exercises/dynamic_methods_test.rb +28 -0
- data/test/exercises/exception_flow_test.rb +17 -0
- data/test/exercises/heredoc_layout_test.rb +18 -0
- data/test/exercises/keyword_forwarding_test.rb +22 -0
- data/test/exercises/lazy_enumeration_test.rb +15 -0
- data/test/exercises/literals_and_operators_test.rb +25 -0
- data/test/exercises/method_contracts_test.rb +28 -0
- data/test/exercises/method_lookup_test.rb +14 -0
- data/test/exercises/nonlocal_exit_test.rb +22 -0
- data/test/exercises/numbered_parameters_test.rb +15 -0
- data/test/exercises/numeric_precision_test.rb +24 -0
- data/test/exercises/pattern_matching_test.rb +18 -0
- data/test/exercises/refinement_scope_test.rb +14 -0
- data/test/exercises/regexp_captures_test.rb +20 -0
- data/test/exercises/runtime_context_test.rb +59 -0
- data/test/exercises/shared_rows_test.rb +34 -0
- data/test/exercises/singleton_pattern_test.rb +16 -0
- data/test/exercises/time_and_date_test.rb +22 -0
- data/test/exercises/visibility_test.rb +22 -0
- metadata +471 -4
- data/Rakefile +0 -12
- data/sig/test_rkoans.rbs +0 -3
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
# SPDX-License-Identifier: CC-BY-NC-SA-3.0
|
|
4
|
+
# Adapted from Ruby Koans by Jim Weirich and Joe O'Brien.
|
|
5
|
+
# See THIRD_PARTY_NOTICES.md for attribution and license terms.
|
|
6
|
+
|
|
7
|
+
module Exercises
|
|
8
|
+
# Predicts nil conversions and missing-method behavior.
|
|
9
|
+
class AboutNil
|
|
10
|
+
# Replace each :fill_me_in with the result described by its example.
|
|
11
|
+
# @return [Hash<Symbol, Boolean | String | Class>]
|
|
12
|
+
def self.koans
|
|
13
|
+
{
|
|
14
|
+
# nil.is_a?(Object)
|
|
15
|
+
nil_object: :fill_me_in,
|
|
16
|
+
# exception class raised by nil.some_method_nil_doesnt_know_about
|
|
17
|
+
missing_method_error: :fill_me_in,
|
|
18
|
+
# a nonempty substring of that exception message
|
|
19
|
+
message_fragment: :fill_me_in,
|
|
20
|
+
# nil.nil?
|
|
21
|
+
nil_predicate: :fill_me_in,
|
|
22
|
+
# nil.to_s
|
|
23
|
+
string_value: :fill_me_in,
|
|
24
|
+
# nil.inspect
|
|
25
|
+
inspected_value: :fill_me_in
|
|
26
|
+
}
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
end
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
# About Nil
|
|
2
|
+
|
|
3
|
+
Replace each `:fill_me_in` in `about_nil.rb` with the result described by its
|
|
4
|
+
example. Predict whether nil is an object, its supported conversions, and what
|
|
5
|
+
happens when a method it does not know is called.
|
|
6
|
+
|
|
7
|
+
For `missing_method_error`, supply the exception class. For `message_fragment`,
|
|
8
|
+
supply a nonempty string found in the exception's message. Predict a fragment
|
|
9
|
+
rather than the full message so diagnostic formatting can vary.
|
|
10
|
+
|
|
11
|
+
Adapted from Ruby Koans by Jim Weirich and Joe O'Brien, licensed under
|
|
12
|
+
CC BY-NC-SA 3.0. See `THIRD_PARTY_NOTICES.md` for attribution and license terms.
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
# Hint
|
|
2
|
+
|
|
3
|
+
Nil is an object with methods. Compare `nil.nil?`, `nil.to_s`, and `nil.inspect`
|
|
4
|
+
in IRB, paying attention to an empty string versus a string spelling `nil`.
|
|
5
|
+
|
|
6
|
+
Call `nil.some_method_nil_doesnt_know_about` and inspect the exception's class
|
|
7
|
+
and message. The error names the missing method. Use a nonempty message fragment
|
|
8
|
+
as a string, without regular-expression delimiters.
|
|
9
|
+
|
|
10
|
+
Adapted from Ruby Koans by Jim Weirich and Joe O'Brien, licensed under
|
|
11
|
+
CC BY-NC-SA 3.0. See `THIRD_PARTY_NOTICES.md` for attribution and license terms.
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
# SPDX-License-Identifier: CC-BY-NC-SA-3.0
|
|
4
|
+
# Adapted from Ruby Koans by Jim Weirich and Joe O'Brien.
|
|
5
|
+
# See THIRD_PARTY_NOTICES.md for attribution and license terms.
|
|
6
|
+
|
|
7
|
+
module Exercises
|
|
8
|
+
# Predicts conversion, inspection, and object identity.
|
|
9
|
+
class AboutObjects
|
|
10
|
+
# Replace each :fill_me_in with the result of its example.
|
|
11
|
+
# @return [Hash<Symbol, Boolean | String | Integer | Class>]
|
|
12
|
+
def self.koans
|
|
13
|
+
{
|
|
14
|
+
# 1.is_a?(Object)
|
|
15
|
+
integer_object: :fill_me_in,
|
|
16
|
+
# 1.5.is_a?(Object)
|
|
17
|
+
float_object: :fill_me_in,
|
|
18
|
+
# 'string'.is_a?(Object)
|
|
19
|
+
string_object: :fill_me_in,
|
|
20
|
+
# nil.is_a?(Object)
|
|
21
|
+
nil_object: :fill_me_in,
|
|
22
|
+
# Object.is_a?(Object)
|
|
23
|
+
class_object: :fill_me_in,
|
|
24
|
+
# 123.to_s
|
|
25
|
+
integer_string: :fill_me_in,
|
|
26
|
+
# nil.to_s
|
|
27
|
+
nil_string: :fill_me_in,
|
|
28
|
+
# 123.inspect
|
|
29
|
+
integer_inspect: :fill_me_in,
|
|
30
|
+
# nil.inspect
|
|
31
|
+
nil_inspect: :fill_me_in,
|
|
32
|
+
# obj = Object.new; obj.object_id.class
|
|
33
|
+
id_type: :fill_me_in,
|
|
34
|
+
# obj = Object.new; another_obj = Object.new; obj.object_id != another_obj.object_id
|
|
35
|
+
distinct_ids: :fill_me_in,
|
|
36
|
+
# 0.object_id
|
|
37
|
+
zero_id: :fill_me_in,
|
|
38
|
+
# 1.object_id
|
|
39
|
+
one_id: :fill_me_in,
|
|
40
|
+
# 2.object_id
|
|
41
|
+
two_id: :fill_me_in,
|
|
42
|
+
# 100.object_id
|
|
43
|
+
hundred_id: :fill_me_in,
|
|
44
|
+
# obj = Object.new; copy = obj.clone; obj != copy
|
|
45
|
+
clone_unequal: :fill_me_in,
|
|
46
|
+
# obj = Object.new; copy = obj.clone; obj.object_id != copy.object_id
|
|
47
|
+
clone_distinct_id: :fill_me_in
|
|
48
|
+
}
|
|
49
|
+
end
|
|
50
|
+
end
|
|
51
|
+
end
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
# About Objects
|
|
2
|
+
|
|
3
|
+
Replace each `:fill_me_in` in `about_objects.rb` with the result of its example.
|
|
4
|
+
Answers include booleans, strings, integers, and the class of an object ID.
|
|
5
|
+
|
|
6
|
+
Explore ordinary values as objects, `to_s` versus `inspect`, identifiers for
|
|
7
|
+
distinct objects, and what happens when a plain object is cloned.
|
|
8
|
+
|
|
9
|
+
The small-integer ID examples observe MRI's representation on this course's
|
|
10
|
+
runtime. Their numeric pattern is an implementation detail; use identity
|
|
11
|
+
comparisons when reasoning about ordinary objects.
|
|
12
|
+
|
|
13
|
+
Adapted from Ruby Koans by Jim Weirich and Joe O'Brien, licensed under
|
|
14
|
+
CC BY-NC-SA 3.0. See `THIRD_PARTY_NOTICES.md` for attribution and license terms.
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
# Hint
|
|
2
|
+
|
|
3
|
+
Compare `nil.to_s` with `nil.inspect` in IRB. One is a string conversion; the
|
|
4
|
+
other is a representation useful for inspecting a value.
|
|
5
|
+
|
|
6
|
+
An object keeps its ID while it is alive, and distinct live objects have
|
|
7
|
+
distinct IDs. A second variable can point to the same object; `clone` creates
|
|
8
|
+
a different object. Inspect IDs for `0`, `1`, `2`, and `100` to find the pattern
|
|
9
|
+
used for these small integers on MRI.
|
|
10
|
+
|
|
11
|
+
Adapted from Ruby Koans by Jim Weirich and Joe O'Brien, licensed under
|
|
12
|
+
CC BY-NC-SA 3.0. See `THIRD_PARTY_NOTICES.md` for attribution and license terms.
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
# SPDX-License-Identifier: CC-BY-NC-SA-3.0
|
|
4
|
+
# Adapted from Ruby Koans by Jim Weirich and Joe O'Brien.
|
|
5
|
+
# See THIRD_PARTY_NOTICES.md for attribution and license terms.
|
|
6
|
+
|
|
7
|
+
module Exercises
|
|
8
|
+
# Predictions for open classes examples.
|
|
9
|
+
class AboutOpenClasses
|
|
10
|
+
# Replace each :fill_me_in with the result of the described expression.
|
|
11
|
+
# @return [Hash<Symbol, Object>]
|
|
12
|
+
# This method is an answer table, not a sequence of operations.
|
|
13
|
+
def self.koans
|
|
14
|
+
{
|
|
15
|
+
# As defined dogs do bark.
|
|
16
|
+
# fido = Dog.new
|
|
17
|
+
# assert_equal __, fido.bark
|
|
18
|
+
# Predict: fido.bark
|
|
19
|
+
as_defined_dogs_do_bark_one: :fill_me_in,
|
|
20
|
+
# After reopening dogs can both wag and bark.
|
|
21
|
+
# fido = Dog.new
|
|
22
|
+
# assert_equal __, fido.wag
|
|
23
|
+
# assert_equal __, fido.bark
|
|
24
|
+
# Predict: fido.wag
|
|
25
|
+
after_reopening_dogs_can_both_wag_and_bark_one: :fill_me_in,
|
|
26
|
+
# Predict: fido.bark
|
|
27
|
+
after_reopening_dogs_can_both_wag_and_bark_two: :fill_me_in,
|
|
28
|
+
# Even existing built in classes can be reopened.
|
|
29
|
+
# assert_equal __, 1.answer_to_life_universe_and_everything?
|
|
30
|
+
# assert_equal __, 42.answer_to_life_universe_and_everything?
|
|
31
|
+
# Predict: 1.answer_to_life_universe_and_everything?
|
|
32
|
+
even_existing_built_in_classes_can_be_reopened_one: :fill_me_in,
|
|
33
|
+
# Predict: 42.answer_to_life_universe_and_everything?
|
|
34
|
+
even_existing_built_in_classes_can_be_reopened_two: :fill_me_in
|
|
35
|
+
}
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
end
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
# About Open Classes
|
|
2
|
+
|
|
3
|
+
Replace each `:fill_me_in` in `about_open_classes.rb` with the predicted result.
|
|
4
|
+
Each field identifies its example. Run the checks after edits to investigate the
|
|
5
|
+
next prediction. Answers include the Ruby values and exception classes shown by
|
|
6
|
+
the examples. Read the setup comments before evaluating an expression.
|
|
7
|
+
|
|
8
|
+
## Example definitions
|
|
9
|
+
|
|
10
|
+
These definitions supply the objects and methods used by the prediction examples.
|
|
11
|
+
They run in the check class `AboutOpenClassesTest`.
|
|
12
|
+
|
|
13
|
+
```ruby
|
|
14
|
+
class Dog
|
|
15
|
+
def bark
|
|
16
|
+
"WOOF"
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
class Dog
|
|
21
|
+
def wag
|
|
22
|
+
"HAPPY"
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
class ::Integer
|
|
27
|
+
def answer_to_life_universe_and_everything?
|
|
28
|
+
self == 42
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
Adapted from Ruby Koans by Jim Weirich and Joe O'Brien, licensed under
|
|
34
|
+
CC BY-NC-SA 3.0. See `THIRD_PARTY_NOTICES.md` for attribution and license terms.
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
# Hint
|
|
2
|
+
|
|
3
|
+
Reopening a class adds methods to that same class. Existing instances see
|
|
4
|
+
the new instance methods too. A leading `::` refers to a top-level class.
|
|
5
|
+
|
|
6
|
+
Adapted from Ruby Koans by Jim Weirich and Joe O'Brien, licensed under
|
|
7
|
+
CC BY-NC-SA 3.0. See `THIRD_PARTY_NOTICES.md` for attribution and license terms.
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
# SPDX-License-Identifier: CC-BY-NC-SA-3.0
|
|
4
|
+
# Adapted from Ruby Koans by Jim Weirich and Joe O'Brien.
|
|
5
|
+
# See THIRD_PARTY_NOTICES.md for attribution and license terms.
|
|
6
|
+
|
|
7
|
+
module Exercises
|
|
8
|
+
# Predictions for pattern matching examples.
|
|
9
|
+
class AboutPatternMatching
|
|
10
|
+
# Replace each :fill_me_in with the result of the described expression.
|
|
11
|
+
# @return [Hash<Symbol, Object>]
|
|
12
|
+
# This method is an answer table, not a sequence of operations.
|
|
13
|
+
def self.koans # rubocop:disable Metrics/MethodLength
|
|
14
|
+
{
|
|
15
|
+
# Pattern may not match.
|
|
16
|
+
# begin
|
|
17
|
+
# case [true, false]
|
|
18
|
+
# in [a, b] if a == b # The condition after pattern is called guard.
|
|
19
|
+
# :match
|
|
20
|
+
# end
|
|
21
|
+
# rescue NoMatchingPatternError => ex
|
|
22
|
+
# What exception has been caught?
|
|
23
|
+
# assert_equal __, ex.class
|
|
24
|
+
# end
|
|
25
|
+
# Predict: ex.class
|
|
26
|
+
pattern_may_not_match_one: :fill_me_in,
|
|
27
|
+
# We can use else.
|
|
28
|
+
# result = case [true, false]
|
|
29
|
+
# in [a, b] if a == b
|
|
30
|
+
# :match
|
|
31
|
+
# else
|
|
32
|
+
# :no_match
|
|
33
|
+
# end
|
|
34
|
+
# assert_equal __, result
|
|
35
|
+
# Predict: result
|
|
36
|
+
we_can_use_else_one: :fill_me_in,
|
|
37
|
+
# Value pattern.
|
|
38
|
+
# assert_equal __, value_pattern(0)
|
|
39
|
+
# assert_equal __, value_pattern(5)
|
|
40
|
+
# assert_equal __, value_pattern(100)
|
|
41
|
+
# assert_equal __, value_pattern('Not a Number!')
|
|
42
|
+
# Predict: value_pattern(0)
|
|
43
|
+
value_pattern_one: :fill_me_in,
|
|
44
|
+
# Predict: value_pattern(5)
|
|
45
|
+
value_pattern_two: :fill_me_in,
|
|
46
|
+
# Predict: value_pattern(100)
|
|
47
|
+
value_pattern_three: :fill_me_in,
|
|
48
|
+
# Predict: value_pattern('Not a Number!')
|
|
49
|
+
value_pattern_four: :fill_me_in,
|
|
50
|
+
# Variable pattern with binding.
|
|
51
|
+
# assert_equal __, variable_pattern_with_binding(1)
|
|
52
|
+
# Predict: variable_pattern_with_binding(1)
|
|
53
|
+
variable_pattern_with_binding_one: :fill_me_in,
|
|
54
|
+
# Variable pattern with pin.
|
|
55
|
+
# assert_equal __, variable_pattern_with_pin(1)
|
|
56
|
+
# Predict: variable_pattern_with_pin(1)
|
|
57
|
+
variable_pattern_with_pin_one: :fill_me_in,
|
|
58
|
+
# Pattern with dropping.
|
|
59
|
+
# assert_equal __, pattern_with_dropping(['I will not be checked', 2])
|
|
60
|
+
# assert_equal __, pattern_with_dropping(['I will not be checked', 'But I will!'])
|
|
61
|
+
# Predict: pattern_with_dropping(['I will not be checked', 2])
|
|
62
|
+
pattern_with_dropping_one: :fill_me_in,
|
|
63
|
+
# Predict: pattern_with_dropping(['I will not be checked', 'But I will!'])
|
|
64
|
+
pattern_with_dropping_two: :fill_me_in,
|
|
65
|
+
# Alternative pattern.
|
|
66
|
+
# assert_equal __, alternative_pattern(0)
|
|
67
|
+
# assert_equal __, alternative_pattern(false)
|
|
68
|
+
# assert_equal __, alternative_pattern(nil)
|
|
69
|
+
# assert_equal __, alternative_pattern(4)
|
|
70
|
+
# Predict: alternative_pattern(0)
|
|
71
|
+
alternative_pattern_one: :fill_me_in,
|
|
72
|
+
# Predict: alternative_pattern(false)
|
|
73
|
+
alternative_pattern_two: :fill_me_in,
|
|
74
|
+
# Predict: alternative_pattern(nil)
|
|
75
|
+
alternative_pattern_three: :fill_me_in,
|
|
76
|
+
# Predict: alternative_pattern(4)
|
|
77
|
+
alternative_pattern_four: :fill_me_in,
|
|
78
|
+
# As pattern.
|
|
79
|
+
# assert_equal __, as_pattern
|
|
80
|
+
# Predict: as_pattern
|
|
81
|
+
as_pattern_one: :fill_me_in,
|
|
82
|
+
# Array pattern.
|
|
83
|
+
# assert_equal __, array_pattern(Deconstructible.new('abcd'))
|
|
84
|
+
# assert_equal __, array_pattern(Deconstructible.new('123'))
|
|
85
|
+
# Predict: array_pattern(Deconstructible.new('abcd'))
|
|
86
|
+
array_pattern_one: :fill_me_in,
|
|
87
|
+
# Predict: array_pattern(Deconstructible.new('123'))
|
|
88
|
+
array_pattern_two: :fill_me_in,
|
|
89
|
+
# Hash pattern.
|
|
90
|
+
# assert_equal __, hash_pattern(LetterAccountant.new('aaabbc'))
|
|
91
|
+
# assert_equal __, hash_pattern(LetterAccountant.new('xyz'))
|
|
92
|
+
# Predict: hash_pattern(LetterAccountant.new('aaabbc'))
|
|
93
|
+
hash_pattern_one: :fill_me_in,
|
|
94
|
+
# Predict: hash_pattern(LetterAccountant.new('xyz'))
|
|
95
|
+
hash_pattern_two: :fill_me_in,
|
|
96
|
+
# Hash pattern with sugar.
|
|
97
|
+
# assert_equal __, hash_pattern_with_sugar(LetterAccountant.new('aaabbc'))
|
|
98
|
+
# assert_equal __, hash_pattern_with_sugar(LetterAccountant.new('xyz'))
|
|
99
|
+
# Predict: hash_pattern_with_sugar(LetterAccountant.new('aaabbc'))
|
|
100
|
+
hash_pattern_with_sugar_one: :fill_me_in,
|
|
101
|
+
# Predict: hash_pattern_with_sugar(LetterAccountant.new('xyz'))
|
|
102
|
+
hash_pattern_with_sugar_two: :fill_me_in
|
|
103
|
+
}
|
|
104
|
+
end
|
|
105
|
+
end
|
|
106
|
+
end
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
# About Pattern Matching
|
|
2
|
+
|
|
3
|
+
Replace each `:fill_me_in` in `about_pattern_matching.rb` with the predicted result.
|
|
4
|
+
Each field identifies its example. Run the checks after edits to investigate the
|
|
5
|
+
next prediction. Answers include the Ruby values and exception classes shown by
|
|
6
|
+
the examples. Read the setup comments before evaluating an expression.
|
|
7
|
+
|
|
8
|
+
## Example definitions
|
|
9
|
+
|
|
10
|
+
These definitions supply the objects and methods used by the prediction examples.
|
|
11
|
+
They run in the check class `AboutPatternMatchingTest`.
|
|
12
|
+
|
|
13
|
+
```ruby
|
|
14
|
+
class Deconstructible
|
|
15
|
+
def initialize(str)
|
|
16
|
+
@data = str
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def deconstruct
|
|
20
|
+
@data&.split('')
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
class LetterAccountant
|
|
25
|
+
def initialize(str)
|
|
26
|
+
@data = str
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
def deconstruct_keys(keys)
|
|
30
|
+
# we will count number of occurrences of each key in our data
|
|
31
|
+
keys.map { |key| [key, @data.count(key.to_s)] }.to_h
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
def value_pattern(variable)
|
|
36
|
+
case variable
|
|
37
|
+
in 0
|
|
38
|
+
:match_exact_value
|
|
39
|
+
in 1..10
|
|
40
|
+
:match_in_range
|
|
41
|
+
in Integer
|
|
42
|
+
:match_with_class
|
|
43
|
+
else
|
|
44
|
+
:no_match
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
def variable_pattern_with_binding(variable)
|
|
49
|
+
case 0
|
|
50
|
+
in variable
|
|
51
|
+
variable
|
|
52
|
+
else
|
|
53
|
+
:no_match
|
|
54
|
+
end
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
def variable_pattern_with_pin(variable)
|
|
58
|
+
case 0
|
|
59
|
+
in ^variable
|
|
60
|
+
variable
|
|
61
|
+
else
|
|
62
|
+
:no_match
|
|
63
|
+
end
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
def pattern_with_dropping(variable)
|
|
67
|
+
case variable
|
|
68
|
+
in [_, 2]
|
|
69
|
+
:match
|
|
70
|
+
else
|
|
71
|
+
:no_match
|
|
72
|
+
end
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
def alternative_pattern(variable)
|
|
76
|
+
case variable
|
|
77
|
+
in 0 | false | nil
|
|
78
|
+
:match
|
|
79
|
+
else
|
|
80
|
+
:no_match
|
|
81
|
+
end
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
def as_pattern
|
|
85
|
+
a = 'First I was afraid'
|
|
86
|
+
|
|
87
|
+
case 'I was petrified'
|
|
88
|
+
in String => a
|
|
89
|
+
a
|
|
90
|
+
else
|
|
91
|
+
:no_match
|
|
92
|
+
end
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
def array_pattern(deconstructible)
|
|
96
|
+
case deconstructible
|
|
97
|
+
in 'a', *res, 'd'
|
|
98
|
+
res
|
|
99
|
+
else
|
|
100
|
+
:no_match
|
|
101
|
+
end
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
def hash_pattern(deconstructible_as_hash)
|
|
105
|
+
case deconstructible_as_hash
|
|
106
|
+
in {a: a, b: b}
|
|
107
|
+
[a, b]
|
|
108
|
+
else
|
|
109
|
+
:no_match
|
|
110
|
+
end
|
|
111
|
+
end
|
|
112
|
+
|
|
113
|
+
def hash_pattern_with_sugar(deconstructible_as_hash)
|
|
114
|
+
case deconstructible_as_hash
|
|
115
|
+
in a:, b:
|
|
116
|
+
[a, b]
|
|
117
|
+
else
|
|
118
|
+
:no_match
|
|
119
|
+
end
|
|
120
|
+
end
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
Adapted from Ruby Koans by Jim Weirich and Joe O'Brien, licensed under
|
|
124
|
+
CC BY-NC-SA 3.0. See `THIRD_PARTY_NOTICES.md` for attribution and license terms.
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
# Hint
|
|
2
|
+
|
|
3
|
+
A pattern can match values, classes, arrays, or hashes. A bare variable binds
|
|
4
|
+
a value; a pinned variable checks its existing value. A guard adds a condition
|
|
5
|
+
after the structural match.
|
|
6
|
+
|
|
7
|
+
Adapted from Ruby Koans by Jim Weirich and Joe O'Brien, licensed under
|
|
8
|
+
CC BY-NC-SA 3.0. See `THIRD_PARTY_NOTICES.md` for attribution and license terms.
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
# SPDX-License-Identifier: CC-BY-NC-SA-3.0
|
|
4
|
+
# Adapted from Ruby Koans by Jim Weirich and Joe O'Brien.
|
|
5
|
+
# See THIRD_PARTY_NOTICES.md for attribution and license terms.
|
|
6
|
+
|
|
7
|
+
module Exercises
|
|
8
|
+
# Records messages while transparently forwarding them to a target.
|
|
9
|
+
class AboutProxyObjectProject
|
|
10
|
+
# Forwards unknown public messages and records their names.
|
|
11
|
+
class Proxy
|
|
12
|
+
attr_reader :messages
|
|
13
|
+
|
|
14
|
+
# @param target [Object] receiver of forwarded messages
|
|
15
|
+
def initialize(target)
|
|
16
|
+
@target = target
|
|
17
|
+
@messages = []
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
# @return [Object] result of the target's public method
|
|
21
|
+
def method_missing(name, ...)
|
|
22
|
+
@target.public_send(name, ...)
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
# @return [Boolean] whether a message has been recorded
|
|
26
|
+
def called?(_name)
|
|
27
|
+
false
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
# @return [Integer] number of recorded calls to a message
|
|
31
|
+
def number_of_times_called(_name)
|
|
32
|
+
0
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
private
|
|
36
|
+
|
|
37
|
+
# Keeps introspection consistent with the target's public methods.
|
|
38
|
+
def respond_to_missing?(name, include_private = false)
|
|
39
|
+
super
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
end
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
# Proxy Object Project
|
|
2
|
+
|
|
3
|
+
Complete `Exercises::AboutProxyObjectProject::Proxy` in `about_proxy_object_project.rb`.
|
|
4
|
+
Forward unknown messages to any target's public methods, preserving positional
|
|
5
|
+
arguments, keywords, blocks and return values. Record message names in order.
|
|
6
|
+
Expose `messages`, `called?(name)` and `number_of_times_called(name)`; reading
|
|
7
|
+
these bookkeeping methods must not add messages. Unsupported messages should
|
|
8
|
+
raise `NoMethodError`. Make `respond_to?` agree with the target's public API.
|
|
9
|
+
|
|
10
|
+
Adapted from Ruby Koans by Jim Weirich and Joe O'Brien, licensed under CC BY-NC-SA 3.0. See `THIRD_PARTY_NOTICES.md`.
|