Bug #3022
closedWhat are $. and ARGF.lineno ?
Description
=begin
- $. is not officially documented.
This makes it difficult to know if it works as expected or not...
The Ruby Prog Language (Flanagan & Matz) states:
"The number of the last line read from the current input file. Equivalent to ARGF.lineno."
This is not true in trunk, as demonstrated by:
$ rubydev -e "
ARGF.gets
File.open('/etc/passwd'){|f| f.gets; f.gets}
p $., ARGF.lineno
" /etc/hosts
2
1
What is the "current input file"? Not clear, but it's not thread local, as shown:
$ rubydev -e "
p $.
Thread.new{File.open('/etc/passwd').gets; p $. }.join;
p $.
"
0
1
1
- ARGF.lineno does not conform to its doc.
The doc states:
Returns the current line number of the current file in ARGF. This value
can be set manually with ARGF.lineno=.
Reading this, I would expect ARGF.lineno to be the same as ARGF.to_io.lineno.
That is not the case:
rubydev -e 'p "#{ARGF.lineno} #{ARGF.to_io.lineno}" while ARGF.gets' /etc/hosts /etc/passwd
"1 1"
"2 2"
...
"25 1"
"26 2"
...
-
Maybe the best definition would be that $. returns the number of line read operations issued, from the last time an IO was read in the current thread?
-
I suggest the documentation of ARGF.lineno be changed to:
Returns the current line number of ARGF as a whole. This value
can be set manually with ARGF.lineno=.
See also [ruby-core:26303]
=end