Project

General

Profile

Actions

Bug #13937

closed

ARGV doesn't behave like an array

Added by lucascaton (Lucas Caton) almost 4 years ago. Updated almost 4 years ago.

Status:
Rejected
Priority:
Normal
Assignee:
-
Target version:
-
ruby -v:
ruby 2.4.2p198 (2017-09-14 revision 59899) [x86_64-darwin16]
[ruby-core:82961]

Description

Ruby allows us to access an array item by passing its index, regardless if there is or not a space between the array and the [] with the index.
Ie.: both of the following lines work:

[][0] # nil
[] [0] # nil

ARGV is an array as well. However, it doesn't work when we add a space to access some index:

ARGV # []
ARGV.class # Array
ARGV == [] # true
ARGV[0] # nil
ARGV [0] # NoMethodError: undefined method `ARGV' for main:Object

The last line should've returned nil.

Ps.: Same happens when you call a file with arguments by running $ ruby file.rb foo bar.
ARGV [0] will also raise an exception.

Updated by jeremyevans0 (Jeremy Evans) almost 4 years ago

  • Status changed from Open to Rejected

lucascaton (Lucas Caton) wrote:

Ruby allows us to access an array item by passing its index, regardless if there is or not a space between the array and the [] with the index.
Ie.: both of the following lines work:

[][0] # nil
[] [0] # nil

ARGV is an array as well. However, it doesn't work when we add a space to access some index:

ARGV # []
ARGV.class # Array
ARGV == [] # true
ARGV[0] # nil
ARGV [0] # NoMethodError: undefined method `ARGV' for main:Object

The last line should've returned nil.

Ps.: Same happens when you call a file with arguments by running $ ruby file.rb foo bar.
ARGV [0] will also raise an exception.

This isn't a bug, you just need to understand how the parser works.

ARGV[0] is parsed as (ARGV)[0], a constant reference and then calling [] with the argument 0 on that reference. It's similar to Object.const_get(:ARGV).public_send(:[], 0).

ARGV [0] is parsed as ARGV([0]), calling the ARGV method with a single argument being the array [0]. It's similar to to send(:ARGV, [0]). You get the NoMethodError here because no method named ARGV has been defined.

This issue isn't related to ARGV specifically, any constant or method called without arguments will have similar behavior:

A = [1]
A[0] # 1
A [0] # NoMethodError
def a; [1] end
a[0] # 1
a [0] # ArgumentError
Actions

Also available in: Atom PDF