Project

General

Profile

Feature #13630

:[] method should accept block in nice syntax

Added by khoan (khoa nguyen) almost 2 years ago. Updated over 1 year ago.

Status:
Closed
Priority:
Normal
Assignee:
-
Target version:
-
[ruby-core:81559]

Description

# given
module Bam
  def self.[](bam)
    yield bam
  end
end

# SyntaxError: unexpected keyword_do_block
Bam['bam'] do |b|
  puts b
end

# SyntaxError: unexpected { arg, expecting end-of-input
Bam['bam'] { |b|
  puts b
}

# Valid but more verbose
Bam.[]('bam') do |b|
  puts b
end

Bam.[]('bam') { |b|
  puts b
}

History

Updated by shevegen (Robert A. Heiler) almost 2 years ago

I agree. I always wondered about this too.

I did not make a suggestion like this because I suspect that one reason may be a parser issue, as otherwise it would most likely have been done already.

In particular for elements without any arguments like:

Bam.[] { |b| puts b }

Or more verbose to use your example:

module Bam
  def self.[](bam=42)
    yield bam
  end
end

Bam.[] { |b| puts b } # => 42

Bam[] { |b| puts b } # => SyntaxError: (irb):14: syntax error, unexpected { arg, expecting end-of-input

Only difference here between failure and success is one lonely '.'. I am not sure if it is technically
possible to get rid of the '.', but if it would be possible, that would be great. The '.' visually
disturbs me when I see [] ... but not at other places, it's weird. :D

Edit: Ok, my example was not good but I guess the difference between .[] and [] can be seen which is the main point.

Updated by nobu (Nobuyoshi Nakada) over 1 year ago

The trunk accepts a block after [] now.

Updated by shyouhei (Shyouhei Urabe) over 1 year ago

  • Status changed from Open to Closed

We looked at this at a developer meeting today and confirmed that this is already done.

Updated by matz (Yukihiro Matsumoto) over 1 year ago

And now mruby does too.

Matz.

Also available in: Atom PDF