Bug #13937
closedARGV doesn't behave like an array
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) about 7 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