Project

General

Profile

Actions

Feature #6023

closed

Add "a ?= 2" support for meaning "a = a.nil? ? 2 : a"

Added by rosenfeld (Rodrigo Rosenfeld Rosas) almost 13 years ago. Updated about 12 years ago.

Status:
Rejected
Target version:
[ruby-core:42630]

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


Related issues 1 (0 open1 closed)

Has duplicate Ruby master - Feature #6561: ?= operatorRejected06/09/2012Actions

Updated by judofyr (Magnus Holm) almost 13 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 false

This 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 almost 13 years ago

Magnus Holm 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 '??' ?

Actions #3

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
Actions

Also available in: Atom PDF

Like0
Like0Like0Like0Like0Like0Like0Like0