Feature #6023
closedAdd "a ?= 2" support for meaning "a = a.nil? ? 2 : a"
Description
I've just proposed this idea to Groovy and I thought the same semantics would be interesting to have in Ruby too:
http://jira.codehaus.org/browse/GROOVY-5306
This is a minor, but important, difference to the "a ||= 2" syntax.
This would be a caching/memoization operator, and it would allow code like this:
a = nil
a ?= false # a is false now
a ?= true # a is still false
This contrasts with
a = nil
a ||= false # a is false now
a ||= true # a is true now
Updated by judofyr (Magnus Holm) over 12 years ago
I've just proposed this idea to Groovy and I thought the same semantics would be interesting to have in Ruby too:
http://jira.codehaus.org/browse/GROOVY-5306
This is a minor, but important, difference to the "a ||= 2" syntax.
This would be a caching/memoization operator, and it would allow code like this:
a = nil
a ?= false # a is false now
a ?= true # a is still falseThis contrasts with
a = nil
a ||= false # a is false now
a ||= true # a is true now
If we want something like this, we should provide a non-assignment
version too. Perl uses // for the same purpose:
sub foo {
my ($foo, %options) = @_;
$foo //= 1;
my $bar = $options{bar} // 2;
return ($foo, $bar)
}
foo(undef, bar => undef) # => (1, 2)
foo(0, bar => 0) # => (0, 0) (0 is false in Perl)
Although I suspect we rather want to use // for float/exact-division
in the future.
Updated by Anonymous over 12 years ago
Magnus Holm judofyr@gmail.com writes:
If we want something like this, we should provide a non-assignment
version too. Perl uses // for the same purpose:sub foo {
my ($foo, %options) = @_;
$foo //= 1;
my $bar = $options{bar} // 2;
return ($foo, $bar)
}foo(undef, bar => undef) # => (1, 2)
foo(0, bar => 0) # => (0, 0) (0 is false in Perl)Although I suspect we rather want to use // for float/exact-division
in the future.
How about '??' ?
Updated by shyouhei (Shyouhei Urabe) over 12 years ago
- Status changed from Open to Assigned
Updated by shevegen (Robert A. Heiler) over 12 years ago
The perl example is not very elegant.
When I see code like this:
$foo //= 1;
I first think that someone wants to divide via / somehow.
The:
a ?= true # a is still false
looks a bit weird. Was ? not used to get the ASCII value of
characters before?
I also rarely see x = x ? y and it reminds me of ternary operator.
Updated by slayer (Vlad Moskovets) over 12 years ago
I think #6561 more convenient to store nil'able and false'able items
Updated by yhara (Yutaka HARA) about 12 years ago
- Target version changed from 2.0.0 to 2.6
Updated by nobu (Nobuyoshi Nakada) about 12 years ago
- Status changed from Assigned to Rejected