One-line pattern matching is no longer experimental
https://github.com/ruby/dev-meeting-log/blob/master/DevelopersMeeting20210715Japan.md#feature-17724-make-the-pin-operator-support-instanceclassglobal-variables-jeremyevans0
This commit is contained in:
parent
fd0df9c4fb
commit
eed5e8f796
2
NEWS.md
2
NEWS.md
@ -23,6 +23,8 @@ Note that each entry is kept to a minimum, see links for details.
|
|||||||
#=> [3, 5]
|
#=> [3, 5]
|
||||||
```
|
```
|
||||||
|
|
||||||
|
* One-line pattern matching is no longer experimental.
|
||||||
|
|
||||||
* Multiple assignment evaluation order has been made consistent with
|
* Multiple assignment evaluation order has been made consistent with
|
||||||
single assignment evaluation order. With single assignment, Ruby
|
single assignment evaluation order. With single assignment, Ruby
|
||||||
uses a left-to-right evaluation order. With this code:
|
uses a left-to-right evaluation order. With this code:
|
||||||
|
@ -441,7 +441,7 @@ Additionally, when matching custom classes, the expected class can be specified
|
|||||||
|
|
||||||
== Current feature status
|
== Current feature status
|
||||||
|
|
||||||
As of Ruby 3.0, one-line pattern matching and find patterns are considered _experimental_: its syntax can change in the future. Every time you use these features in code, a warning will be printed:
|
As of Ruby 3.1, find patterns are considered _experimental_: its syntax can change in the future. Every time you use these features in code, a warning will be printed:
|
||||||
|
|
||||||
[0] => [*, 0, *]
|
[0] => [*, 0, *]
|
||||||
# warning: Find pattern is experimental, and the behavior may change in future versions of Ruby!
|
# warning: Find pattern is experimental, and the behavior may change in future versions of Ruby!
|
||||||
|
14
parse.y
14
parse.y
@ -523,7 +523,6 @@ static NODE *new_find_pattern(struct parser_params *p, NODE *constant, NODE *fnd
|
|||||||
static NODE *new_find_pattern_tail(struct parser_params *p, ID pre_rest_arg, NODE *args, ID post_rest_arg, const YYLTYPE *loc);
|
static NODE *new_find_pattern_tail(struct parser_params *p, ID pre_rest_arg, NODE *args, ID post_rest_arg, const YYLTYPE *loc);
|
||||||
static NODE *new_hash_pattern(struct parser_params *p, NODE *constant, NODE *hshptn, const YYLTYPE *loc);
|
static NODE *new_hash_pattern(struct parser_params *p, NODE *constant, NODE *hshptn, const YYLTYPE *loc);
|
||||||
static NODE *new_hash_pattern_tail(struct parser_params *p, NODE *kw_args, ID kw_rest_arg, const YYLTYPE *loc);
|
static NODE *new_hash_pattern_tail(struct parser_params *p, NODE *kw_args, ID kw_rest_arg, const YYLTYPE *loc);
|
||||||
static void warn_one_line_pattern_matching(struct parser_params *p, NODE *node, NODE *pattern, bool right_assign);
|
|
||||||
|
|
||||||
static NODE *new_kw_arg(struct parser_params *p, NODE *k, const YYLTYPE *loc);
|
static NODE *new_kw_arg(struct parser_params *p, NODE *k, const YYLTYPE *loc);
|
||||||
static NODE *args_with_numbered(struct parser_params*,NODE*,int);
|
static NODE *args_with_numbered(struct parser_params*,NODE*,int);
|
||||||
@ -1739,7 +1738,6 @@ expr : command_call
|
|||||||
p->ctxt.in_kwarg = $<ctxt>3.in_kwarg;
|
p->ctxt.in_kwarg = $<ctxt>3.in_kwarg;
|
||||||
/*%%%*/
|
/*%%%*/
|
||||||
$$ = NEW_CASE3($1, NEW_IN($5, 0, 0, &@5), &@$);
|
$$ = NEW_CASE3($1, NEW_IN($5, 0, 0, &@5), &@$);
|
||||||
warn_one_line_pattern_matching(p, $$, $5, true);
|
|
||||||
/*% %*/
|
/*% %*/
|
||||||
/*% ripper: case!($1, in!($5, Qnil, Qnil)) %*/
|
/*% ripper: case!($1, in!($5, Qnil, Qnil)) %*/
|
||||||
}
|
}
|
||||||
@ -1758,7 +1756,6 @@ expr : command_call
|
|||||||
p->ctxt.in_kwarg = $<ctxt>3.in_kwarg;
|
p->ctxt.in_kwarg = $<ctxt>3.in_kwarg;
|
||||||
/*%%%*/
|
/*%%%*/
|
||||||
$$ = NEW_CASE3($1, NEW_IN($5, NEW_TRUE(&@5), NEW_FALSE(&@5), &@5), &@$);
|
$$ = NEW_CASE3($1, NEW_IN($5, NEW_TRUE(&@5), NEW_FALSE(&@5), &@5), &@$);
|
||||||
warn_one_line_pattern_matching(p, $$, $5, false);
|
|
||||||
/*% %*/
|
/*% %*/
|
||||||
/*% ripper: case!($1, in!($5, Qnil, Qnil)) %*/
|
/*% ripper: case!($1, in!($5, Qnil, Qnil)) %*/
|
||||||
}
|
}
|
||||||
@ -12152,17 +12149,6 @@ new_hash_pattern_tail(struct parser_params *p, NODE *kw_args, ID kw_rest_arg, co
|
|||||||
return node;
|
return node;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
|
||||||
warn_one_line_pattern_matching(struct parser_params *p, NODE *node, NODE *pattern, bool right_assign)
|
|
||||||
{
|
|
||||||
enum node_type type;
|
|
||||||
type = nd_type(pattern);
|
|
||||||
|
|
||||||
if (rb_warning_category_enabled_p(RB_WARN_CATEGORY_EXPERIMENTAL) &&
|
|
||||||
!(right_assign && (type == NODE_LASGN || type == NODE_DASGN || type == NODE_DASGN_CURR)))
|
|
||||||
rb_warn0L_experimental(nd_line(node), "One-line pattern matching is experimental, and the behavior may change in future versions of Ruby!");
|
|
||||||
}
|
|
||||||
|
|
||||||
static NODE*
|
static NODE*
|
||||||
dsym_node(struct parser_params *p, NODE *node, const YYLTYPE *loc)
|
dsym_node(struct parser_params *p, NODE *node, const YYLTYPE *loc)
|
||||||
{
|
{
|
||||||
|
@ -1545,8 +1545,6 @@ END
|
|||||||
|
|
||||||
def test_experimental_warning
|
def test_experimental_warning
|
||||||
assert_experimental_warning("case [0]; in [*, 0, *]; end")
|
assert_experimental_warning("case [0]; in [*, 0, *]; end")
|
||||||
assert_experimental_warning("0 => 0")
|
|
||||||
assert_experimental_warning("0 in a")
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
END_of_GUARD
|
END_of_GUARD
|
||||||
|
Loading…
x
Reference in New Issue
Block a user