rbs 3.0.0.dev.2 → 3.0.0.dev.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.github/workflows/comments.yml +2 -1
- data/.github/workflows/ruby.yml +4 -0
- data/Gemfile.lock +11 -11
- data/Rakefile +2 -2
- data/Steepfile +1 -1
- data/core/array.rbs +573 -423
- data/core/basic_object.rbs +11 -39
- data/core/binding.rbs +1 -1
- data/core/builtin.rbs +8 -0
- data/core/class.rbs +37 -0
- data/core/comparable.rbs +7 -18
- data/core/complex.rbs +2 -2
- data/core/data.rbs +419 -0
- data/core/dir.rbs +52 -104
- data/core/encoding.rbs +22 -181
- data/core/enumerable.rbs +212 -175
- data/core/enumerator/product.rbs +96 -0
- data/core/enumerator.rbs +57 -8
- data/core/errors.rbs +8 -2
- data/core/exception.rbs +41 -0
- data/core/fiber.rbs +95 -12
- data/core/file.rbs +840 -275
- data/core/file_test.rbs +34 -19
- data/core/float.rbs +40 -96
- data/core/gc.rbs +15 -3
- data/core/hash.rbs +113 -175
- data/core/integer.rbs +85 -145
- data/core/io/buffer.rbs +187 -60
- data/core/io/wait.rbs +28 -16
- data/core/io.rbs +1859 -1389
- data/core/kernel.rbs +525 -961
- data/core/match_data.rbs +306 -142
- data/core/math.rbs +506 -234
- data/core/method.rbs +0 -24
- data/core/module.rbs +110 -17
- data/core/nil_class.rbs +2 -0
- data/core/numeric.rbs +76 -144
- data/core/object.rbs +88 -212
- data/core/proc.rbs +17 -5
- data/core/process.rbs +22 -5
- data/core/ractor.rbs +1 -1
- data/core/random.rbs +20 -3
- data/core/range.rbs +91 -89
- data/core/rational.rbs +2 -3
- data/core/rbs/unnamed/argf.rbs +177 -120
- data/core/rbs/unnamed/env_class.rbs +89 -163
- data/core/rbs/unnamed/random.rbs +36 -12
- data/core/refinement.rbs +8 -0
- data/core/regexp.rbs +462 -272
- data/core/ruby_vm.rbs +210 -0
- data/{stdlib/set/0 → core}/set.rbs +43 -47
- data/core/string.rbs +1403 -1332
- data/core/string_io.rbs +191 -107
- data/core/struct.rbs +67 -63
- data/core/symbol.rbs +187 -201
- data/core/thread.rbs +40 -35
- data/core/time.rbs +902 -826
- data/core/trace_point.rbs +55 -6
- data/core/unbound_method.rbs +48 -24
- data/docs/collection.md +4 -0
- data/docs/syntax.md +55 -0
- data/ext/rbs_extension/parser.c +5 -6
- data/lib/rbs/cli.rb +6 -1
- data/lib/rbs/collection/cleaner.rb +8 -1
- data/lib/rbs/collection/config/lockfile.rb +3 -1
- data/lib/rbs/collection/config/lockfile_generator.rb +16 -14
- data/lib/rbs/collection/config.rb +1 -1
- data/lib/rbs/collection/sources/git.rb +9 -2
- data/lib/rbs/collection/sources/local.rb +79 -0
- data/lib/rbs/collection/sources.rb +8 -1
- data/lib/rbs/environment.rb +6 -5
- data/lib/rbs/environment_loader.rb +3 -2
- data/lib/rbs/errors.rb +18 -0
- data/lib/rbs/locator.rb +26 -7
- data/lib/rbs/sorter.rb +2 -2
- data/lib/rbs/version.rb +1 -1
- data/sig/collection/sources.rbs +32 -3
- data/sig/environment.rbs +2 -3
- data/sig/locator.rbs +14 -2
- data/sig/shims/{abstract_syntax_tree.rbs → _abstract_syntax_tree.rbs} +0 -0
- data/stdlib/bigdecimal/0/big_decimal.rbs +16 -13
- data/stdlib/cgi/0/core.rbs +16 -0
- data/stdlib/coverage/0/coverage.rbs +50 -8
- data/stdlib/csv/0/csv.rbs +1 -1
- data/stdlib/date/0/date.rbs +856 -726
- data/stdlib/date/0/date_time.rbs +83 -210
- data/stdlib/erb/0/erb.rbs +13 -36
- data/stdlib/etc/0/etc.rbs +127 -20
- data/stdlib/fileutils/0/fileutils.rbs +1290 -381
- data/stdlib/logger/0/logger.rbs +466 -316
- data/stdlib/net-http/0/net-http.rbs +2211 -534
- data/stdlib/nkf/0/nkf.rbs +5 -5
- data/stdlib/objspace/0/objspace.rbs +31 -14
- data/stdlib/openssl/0/openssl.rbs +11 -7
- data/stdlib/optparse/0/optparse.rbs +20 -17
- data/stdlib/pathname/0/pathname.rbs +21 -4
- data/stdlib/pstore/0/pstore.rbs +378 -154
- data/stdlib/pty/0/pty.rbs +24 -8
- data/stdlib/ripper/0/ripper.rbs +1650 -0
- data/stdlib/socket/0/addrinfo.rbs +9 -15
- data/stdlib/socket/0/socket.rbs +36 -3
- data/stdlib/strscan/0/string_scanner.rbs +7 -5
- data/stdlib/tempfile/0/tempfile.rbs +104 -44
- data/stdlib/time/0/time.rbs +2 -2
- data/stdlib/uri/0/file.rbs +5 -0
- data/stdlib/uri/0/generic.rbs +2 -2
- data/stdlib/yaml/0/yaml.rbs +2 -2
- data/stdlib/zlib/0/zlib.rbs +1 -1
- metadata +8 -6
- data/core/deprecated.rbs +0 -9
- data/sig/shims/ripper.rbs +0 -8
data/core/io.rbs
CHANGED
@@ -1,230 +1,94 @@
|
|
1
1
|
# <!-- rdoc-file=io.c -->
|
2
|
-
#
|
3
|
-
#
|
4
|
-
#
|
2
|
+
# An instance of class IO (commonly called a *stream*) represents an
|
3
|
+
# input/output stream in the underlying operating system. Class IO is the basis
|
4
|
+
# for input and output in Ruby.
|
5
5
|
#
|
6
|
-
#
|
7
|
-
#
|
8
|
-
#
|
9
|
-
#
|
10
|
-
# The Kernel#open method can create an IO (or File) object for these types of
|
11
|
-
# arguments:
|
12
|
-
#
|
13
|
-
# * A plain string represents a filename suitable for the underlying operating
|
14
|
-
# system.
|
15
|
-
#
|
16
|
-
# * A string starting with `"|"` indicates a subprocess. The remainder of the
|
17
|
-
# string following the `"|"` is invoked as a process with appropriate
|
18
|
-
# input/output channels connected to it.
|
19
|
-
#
|
20
|
-
# * A string equal to `"|-"` will create another Ruby instance as a
|
21
|
-
# subprocess.
|
22
|
-
#
|
23
|
-
#
|
24
|
-
# The IO may be opened with different file modes (read-only, write-only) and
|
25
|
-
# encodings for proper conversion. See IO.new for these options. See
|
26
|
-
# Kernel#open for details of the various command formats described above.
|
27
|
-
#
|
28
|
-
# IO.popen, the Open3 library, or Process#spawn may also be used to communicate
|
29
|
-
# with subprocesses through an IO.
|
30
|
-
#
|
31
|
-
# Ruby will convert pathnames between different operating system conventions if
|
32
|
-
# possible. For instance, on a Windows system the filename
|
33
|
-
# `"/gumby/ruby/test.rb"` will be opened as `"\gumby\ruby\test.rb"`. When
|
34
|
-
# specifying a Windows-style filename in a Ruby string, remember to escape the
|
35
|
-
# backslashes:
|
36
|
-
#
|
37
|
-
# "C:\\gumby\\ruby\\test.rb"
|
38
|
-
#
|
39
|
-
# Our examples here will use the Unix-style forward slashes; File::ALT_SEPARATOR
|
40
|
-
# can be used to get the platform-specific separator character.
|
6
|
+
# Class File is the only class in the Ruby core that is a subclass of IO. Some
|
7
|
+
# classes in the Ruby standard library are also subclasses of IO; these include
|
8
|
+
# TCPSocket and UDPSocket.
|
41
9
|
#
|
42
10
|
# The global constant ARGF (also accessible as `$<`) provides an IO-like stream
|
43
|
-
#
|
44
|
-
#
|
45
|
-
# access the name of the file currently being read.
|
46
|
-
#
|
47
|
-
# ## io/console
|
48
|
-
#
|
49
|
-
# The io/console extension provides methods for interacting with the console.
|
50
|
-
# The console can be accessed from IO.console or the standard input/output/error
|
51
|
-
# IO objects.
|
52
|
-
#
|
53
|
-
# Requiring io/console adds the following methods:
|
54
|
-
#
|
55
|
-
# * IO::console
|
56
|
-
# * IO#raw
|
57
|
-
# * IO#raw!
|
58
|
-
# * IO#cooked
|
59
|
-
# * IO#cooked!
|
60
|
-
# * IO#getch
|
61
|
-
# * IO#echo=
|
62
|
-
# * IO#echo?
|
63
|
-
# * IO#noecho
|
64
|
-
# * IO#winsize
|
65
|
-
# * IO#winsize=
|
66
|
-
# * IO#iflush
|
67
|
-
# * IO#ioflush
|
68
|
-
# * IO#oflush
|
69
|
-
#
|
70
|
-
#
|
71
|
-
# Example:
|
72
|
-
#
|
73
|
-
# require 'io/console'
|
74
|
-
# rows, columns = $stdout.winsize
|
75
|
-
# puts "Your screen is #{columns} wide and #{rows} tall"
|
76
|
-
#
|
77
|
-
# ## Example Files
|
78
|
-
#
|
79
|
-
# Many examples here use these filenames and their corresponding files:
|
80
|
-
#
|
81
|
-
# * `t.txt`: A text-only file that is assumed to exist via:
|
82
|
-
#
|
83
|
-
# text = <<~EOT
|
84
|
-
# This is line one.
|
85
|
-
# This is the second line.
|
86
|
-
# This is the third line.
|
87
|
-
# EOT
|
88
|
-
# File.write('t.txt', text)
|
89
|
-
#
|
90
|
-
# * `t.dat`: A data file that is assumed to exist via:
|
91
|
-
#
|
92
|
-
# data = "\u9990\u9991\u9992\u9993\u9994"
|
93
|
-
# f = File.open('t.dat', 'wb:UTF-16')
|
94
|
-
# f.write(data)
|
95
|
-
# f.close
|
11
|
+
# that allows access to all file paths found in ARGV (or found in STDIN if ARGV
|
12
|
+
# is empty). ARGF is not itself a subclass of IO.
|
96
13
|
#
|
97
|
-
#
|
14
|
+
# Class StringIO provides an IO-like stream that handles a String. StringIO is
|
15
|
+
# not itself a subclass of IO.
|
98
16
|
#
|
99
|
-
#
|
17
|
+
# Important objects based on IO include:
|
100
18
|
#
|
101
|
-
# *
|
19
|
+
# * $stdin.
|
20
|
+
# * $stdout.
|
21
|
+
# * $stderr.
|
22
|
+
# * Instances of class File.
|
102
23
|
#
|
103
24
|
#
|
104
|
-
#
|
25
|
+
# An instance of IO may be created using:
|
105
26
|
#
|
106
|
-
#
|
107
|
-
#
|
27
|
+
# * IO.new: returns a new IO object for the given integer file descriptor.
|
28
|
+
# * IO.open: passes a new IO object to the given block.
|
29
|
+
# * IO.popen: returns a new IO object that is connected to the $stdin and
|
30
|
+
# $stdout of a newly-launched subprocess.
|
31
|
+
# * Kernel#open: Returns a new IO object connected to a given source: stream,
|
32
|
+
# file, or subprocess.
|
108
33
|
#
|
109
|
-
# * Whether the stream is to be read-only, write-only, or read-write.
|
110
|
-
# * Whether the stream is positioned at its beginning or its end.
|
111
|
-
# * Whether the stream treats data as text-only or binary.
|
112
|
-
# * The external and internal encodings.
|
113
34
|
#
|
35
|
+
# Like a File stream, an IO stream has:
|
114
36
|
#
|
115
|
-
#
|
37
|
+
# * A read/write mode, which may be read-only, write-only, or read/write; see
|
38
|
+
# [Read/Write Mode](rdoc-ref:File@Read-2FWrite+Mode).
|
39
|
+
# * A data mode, which may be text-only or binary; see [Data
|
40
|
+
# Mode](rdoc-ref:File@Data+Mode).
|
41
|
+
# * Internal and external encodings; see [Encodings](rdoc-ref:File@Encodings).
|
116
42
|
#
|
117
|
-
# When `mode` is an integer it must be one or more (combined by bitwise OR (`|`)
|
118
|
-
# of the modes defined in File::Constants:
|
119
43
|
#
|
120
|
-
#
|
121
|
-
# * `File::WRONLY`: Open for writing only.
|
122
|
-
# * `File::RDWR`: Open for reading and writing.
|
123
|
-
# * `File::APPEND`: Open for appending only.
|
124
|
-
# * `File::CREAT`: Create file if it does not exist.
|
125
|
-
# * `File::EXCL`: Raise an exception if `File::CREAT` is given and the file
|
126
|
-
# exists.
|
44
|
+
# And like other IO streams, it has:
|
127
45
|
#
|
46
|
+
# * A position, which determines where in the stream the next read or write is
|
47
|
+
# to occur; see [Position](rdoc-ref:IO@Position).
|
48
|
+
# * A line number, which is a special, line-oriented, "position" (different
|
49
|
+
# from the position mentioned above); see [Line
|
50
|
+
# Number](rdoc-ref:IO@Line+Number).
|
128
51
|
#
|
129
|
-
# Examples:
|
130
52
|
#
|
131
|
-
#
|
132
|
-
# File.new('t.tmp', File::RDWR | File::CREAT | File::EXCL)
|
53
|
+
# ## Extension `io/console`
|
133
54
|
#
|
134
|
-
#
|
135
|
-
#
|
55
|
+
# Extension `io/console` provides numerous methods for interacting with the
|
56
|
+
# console; requiring it adds numerous methods to class IO.
|
136
57
|
#
|
137
|
-
#
|
138
|
-
#
|
139
|
-
# When `mode` is a string it must begin with one of the following:
|
140
|
-
#
|
141
|
-
# * `'r'`: Read-only stream, positioned at the beginning; the stream cannot be
|
142
|
-
# changed to writable.
|
143
|
-
# * `'w'`: Write-only stream, positioned at the beginning; the stream cannot
|
144
|
-
# be changed to readable.
|
145
|
-
# * `'a'`: Write-only stream, positioned at the end; every write appends to
|
146
|
-
# the end; the stream cannot be changed to readable.
|
147
|
-
# * `'r+'`: Read-write stream, positioned at the beginning.
|
148
|
-
# * `'w+'`: Read-write stream, positioned at the end.
|
149
|
-
# * `'a+'`: Read-write stream, positioned at the end.
|
150
|
-
#
|
151
|
-
#
|
152
|
-
# For a writable file stream (that is, any except read-only), the file is
|
153
|
-
# truncated to zero if it exists, and is created if it does not exist.
|
154
|
-
#
|
155
|
-
# Examples:
|
156
|
-
#
|
157
|
-
# File.open('t.txt', 'r')
|
158
|
-
# File.open('t.tmp', 'w')
|
159
|
-
#
|
160
|
-
# Either of the following may be suffixed to any of the above:
|
161
|
-
#
|
162
|
-
# * `'t'`: Text data; sets the default external encoding to `Encoding::UTF_8`;
|
163
|
-
# on Windows, enables conversion between EOL and CRLF.
|
164
|
-
# * `'b'`: Binary data; sets the default external encoding to
|
165
|
-
# `Encoding::ASCII_8BIT`; on Windows, suppresses conversion between EOL and
|
166
|
-
# CRLF.
|
167
|
-
#
|
168
|
-
#
|
169
|
-
# If neither is given, the stream defaults to text data.
|
170
|
-
#
|
171
|
-
# Examples:
|
172
|
-
#
|
173
|
-
# File.open('t.txt', 'rt')
|
174
|
-
# File.open('t.dat', 'rb')
|
175
|
-
#
|
176
|
-
# The following may be suffixed to any writable mode above:
|
177
|
-
#
|
178
|
-
# * `'x'`: Creates the file if it does not exist; raises an exception if the
|
179
|
-
# file exists.
|
180
|
-
#
|
181
|
-
#
|
182
|
-
# Example:
|
183
|
-
#
|
184
|
-
# File.open('t.tmp', 'wx')
|
185
|
-
#
|
186
|
-
# Finally, the mode string may specify encodings -- either external encoding
|
187
|
-
# only or both external and internal encodings -- by appending one or both
|
188
|
-
# encoding names, separated by colons:
|
58
|
+
# ## Example Files
|
189
59
|
#
|
190
|
-
#
|
191
|
-
# f.external_encoding # => #<Encoding:ASCII-8BIT>
|
192
|
-
# f.internal_encoding # => nil
|
193
|
-
# f = File.new('t.dat', 'rb:UTF-16')
|
194
|
-
# f.external_encoding # => #<Encoding:UTF-16 (dummy)>
|
195
|
-
# f.internal_encoding # => nil
|
196
|
-
# f = File.new('t.dat', 'rb:UTF-16:UTF-16')
|
197
|
-
# f.external_encoding # => #<Encoding:UTF-16 (dummy)>
|
198
|
-
# f.internal_encoding # => #<Encoding:UTF-16>
|
60
|
+
# Many examples here use these variables:
|
199
61
|
#
|
200
|
-
#
|
62
|
+
# # English text with newlines.
|
63
|
+
# text = <<~EOT
|
64
|
+
# First line
|
65
|
+
# Second line
|
201
66
|
#
|
202
|
-
#
|
203
|
-
#
|
67
|
+
# Fourth line
|
68
|
+
# Fifth line
|
69
|
+
# EOT
|
204
70
|
#
|
205
|
-
#
|
71
|
+
# # Russian text.
|
72
|
+
# russian = "\u{442 435 441 442}" # => "тест"
|
206
73
|
#
|
207
|
-
#
|
208
|
-
#
|
74
|
+
# # Binary data.
|
75
|
+
# data = "\u9990\u9991\u9992\u9993\u9994"
|
209
76
|
#
|
210
|
-
#
|
211
|
-
#
|
212
|
-
# internal to external encoding. For further details about transcoding input and
|
213
|
-
# output, see Encoding.
|
77
|
+
# # Text file.
|
78
|
+
# File.write('t.txt', text)
|
214
79
|
#
|
215
|
-
#
|
216
|
-
#
|
217
|
-
# determine the encoding. For UTF-16 encodings the file open mode must be
|
218
|
-
# binary. If the BOM is found, it is stripped and the external encoding from the
|
219
|
-
# BOM is used.
|
80
|
+
# # File with Russian text.
|
81
|
+
# File.write('t.rus', russian)
|
220
82
|
#
|
221
|
-
#
|
222
|
-
#
|
83
|
+
# # File with binary data.
|
84
|
+
# f = File.new('t.dat', 'wb:UTF-16')
|
85
|
+
# f.write(data)
|
86
|
+
# f.close
|
223
87
|
#
|
224
88
|
# ## Open Options
|
225
89
|
#
|
226
|
-
# A number of IO methods accept
|
227
|
-
#
|
90
|
+
# A number of IO methods accept optional keyword arguments that determine how a
|
91
|
+
# new stream is to be opened:
|
228
92
|
#
|
229
93
|
# * `:mode`: Stream mode.
|
230
94
|
# * `:flags`: Integer file open flags; If `mode` is also given, the two are
|
@@ -241,430 +105,520 @@
|
|
241
105
|
# otherwise.
|
242
106
|
# * `:autoclose`: If a truthy value, specifies that the `fd` will close when
|
243
107
|
# the stream closes; otherwise it remains open.
|
108
|
+
# * `:path:` If a string value is provided, it is used in #inspect and is
|
109
|
+
# available as #path method.
|
244
110
|
#
|
245
111
|
#
|
246
112
|
# Also available are the options offered in String#encode, which may control
|
247
113
|
# conversion between external internal encoding.
|
248
114
|
#
|
249
|
-
# ##
|
115
|
+
# ## Basic IO
|
250
116
|
#
|
251
|
-
#
|
252
|
-
#
|
117
|
+
# You can perform basic stream IO with these methods, which typically operate on
|
118
|
+
# multi-byte strings:
|
253
119
|
#
|
254
|
-
# *
|
120
|
+
# * IO#read: Reads and returns some or all of the remaining bytes from the
|
121
|
+
# stream.
|
122
|
+
# * IO#write: Writes zero or more strings to the stream; each given object
|
123
|
+
# that is not already a string is converted via `to_s`.
|
255
124
|
#
|
256
125
|
#
|
257
|
-
#
|
126
|
+
# ### Position
|
258
127
|
#
|
259
|
-
# An IO stream has a *position*, which is the
|
260
|
-
#
|
128
|
+
# An IO stream has a nonnegative integer *position*, which is the byte offset at
|
129
|
+
# which the next read or write is to occur. A new stream has position zero (and
|
130
|
+
# line number zero); method `rewind` resets the position (and line number) to
|
131
|
+
# zero.
|
261
132
|
#
|
262
|
-
#
|
263
|
-
# position is `n` (*bytes*) may not have `n` *characters* preceding the current
|
264
|
-
# position -- there may be fewer.
|
133
|
+
# The relevant methods:
|
265
134
|
#
|
266
|
-
#
|
135
|
+
# * IO#tell (aliased as `#pos`): Returns the current position (in bytes) in
|
136
|
+
# the stream.
|
137
|
+
# * IO#pos=: Sets the position of the stream to a given integer `new_position`
|
138
|
+
# (in bytes).
|
139
|
+
# * IO#seek: Sets the position of the stream to a given integer `offset` (in
|
140
|
+
# bytes), relative to a given position `whence` (indicating the beginning,
|
141
|
+
# end, or current position).
|
142
|
+
# * IO#rewind: Positions the stream at the beginning (also resetting the line
|
143
|
+
# number).
|
267
144
|
#
|
268
|
-
# * At the beginning (position `0`) if its mode is `'r'`, `'w'`, or `'r+'`.
|
269
|
-
# * At the end (position `self.size`) if its mode is `'a'`, `'w+'`, or `'a+'`.
|
270
145
|
#
|
146
|
+
# ### Open and Closed Streams
|
271
147
|
#
|
272
|
-
#
|
148
|
+
# A new IO stream may be open for reading, open for writing, or both.
|
273
149
|
#
|
274
|
-
#
|
275
|
-
# * IO#eof? and its alias IO#eof return whether the position is at the end of
|
276
|
-
# a readable stream.
|
150
|
+
# A stream is automatically closed when claimed by the garbage collector.
|
277
151
|
#
|
152
|
+
# Attempted reading or writing on a closed stream raises an exception.
|
278
153
|
#
|
279
|
-
#
|
154
|
+
# The relevant methods:
|
280
155
|
#
|
281
|
-
#
|
282
|
-
#
|
283
|
-
#
|
284
|
-
#
|
285
|
-
# f.readline # => "This is the second line.\n"
|
286
|
-
# f.tell # => 45
|
287
|
-
# f.eof? # => false
|
288
|
-
# f.readline # => "Here's the third line.\n"
|
289
|
-
# f.eof? # => true
|
156
|
+
# * IO#close: Closes the stream for both reading and writing.
|
157
|
+
# * IO#close_read: Closes the stream for reading.
|
158
|
+
# * IO#close_write: Closes the stream for writing.
|
159
|
+
# * IO#closed?: Returns whether the stream is closed.
|
290
160
|
#
|
291
|
-
# Writing to a stream usually changes its position:
|
292
161
|
#
|
293
|
-
#
|
294
|
-
# f.tell # => 0
|
295
|
-
# f.write('foo') # => 3
|
296
|
-
# f.tell # => 3
|
297
|
-
# f.write('bar') # => 3
|
298
|
-
# f.tell # => 6
|
162
|
+
# ### End-of-Stream
|
299
163
|
#
|
300
|
-
#
|
164
|
+
# You can query whether a stream is positioned at its end:
|
301
165
|
#
|
302
|
-
#
|
303
|
-
#
|
304
|
-
# p "position=#{f.pos} eof?=#{f.eof?} line=#{line}"
|
305
|
-
# end
|
166
|
+
# * IO#eof? (also aliased as `#eof`): Returns whether the stream is at
|
167
|
+
# end-of-stream.
|
306
168
|
#
|
307
|
-
# Output:
|
308
169
|
#
|
309
|
-
#
|
310
|
-
# "position=45 eof?=false line=This is the second line.\n"
|
311
|
-
# "position=70 eof?=true line=This is the third line.\n"
|
170
|
+
# You can reposition to end-of-stream by using method IO#seek:
|
312
171
|
#
|
313
|
-
#
|
172
|
+
# f = File.new('t.txt')
|
173
|
+
# f.eof? # => false
|
174
|
+
# f.seek(0, :END)
|
175
|
+
# f.eof? # => true
|
176
|
+
# f.close
|
314
177
|
#
|
315
|
-
#
|
316
|
-
# * IO#rewind changes the position to the beginning.
|
178
|
+
# Or by reading all stream content (which is slower than using IO#seek):
|
317
179
|
#
|
180
|
+
# f.rewind
|
181
|
+
# f.eof? # => false
|
182
|
+
# f.read # => "First line\nSecond line\n\nFourth line\nFifth line\n"
|
183
|
+
# f.eof? # => true
|
318
184
|
#
|
319
|
-
# ## Line
|
185
|
+
# ## Line IO
|
320
186
|
#
|
321
|
-
#
|
322
|
-
# line number in the stream where the next read will occur.
|
187
|
+
# You can read an IO stream line-by-line using these methods:
|
323
188
|
#
|
324
|
-
#
|
189
|
+
# * IO#each_line: Reads each remaining line, passing it to the given block.
|
190
|
+
# * IO#gets: Returns the next line.
|
191
|
+
# * IO#readline: Like #gets, but raises an exception at end-of-stream.
|
192
|
+
# * IO#readlines: Returns all remaining lines in an array.
|
325
193
|
#
|
326
|
-
# Method IO#lineno returns the line number.
|
327
194
|
#
|
328
|
-
#
|
195
|
+
# Each of these reader methods accepts:
|
329
196
|
#
|
330
|
-
#
|
331
|
-
#
|
332
|
-
#
|
333
|
-
#
|
334
|
-
# f.readline # => "This is the second line.\n"
|
335
|
-
# f.lineno # => 2
|
336
|
-
# f.readline # => "Here's the third line.\n"
|
337
|
-
# f.lineno # => 3
|
338
|
-
# f.eof? # => true
|
197
|
+
# * An optional line separator, `sep`; see [Line
|
198
|
+
# Separator](rdoc-ref:IO@Line+Separator).
|
199
|
+
# * An optional line-size limit, `limit`; see [Line
|
200
|
+
# Limit](rdoc-ref:IO@Line+Limit).
|
339
201
|
#
|
340
|
-
# Iterating over lines in a stream usually changes its line number:
|
341
202
|
#
|
342
|
-
#
|
343
|
-
#
|
344
|
-
# p "position=#{f.pos} eof?=#{f.eof?} line=#{line}"
|
345
|
-
# end
|
203
|
+
# For each of these reader methods, reading may begin mid-line, depending on the
|
204
|
+
# stream's position; see [Position](rdoc-ref:IO@Position):
|
346
205
|
#
|
347
|
-
#
|
206
|
+
# f = File.new('t.txt')
|
207
|
+
# f.pos = 27
|
208
|
+
# f.each_line {|line| p line }
|
209
|
+
# f.close
|
348
210
|
#
|
349
|
-
#
|
350
|
-
# "position=45 eof?=false line=This is the second line.\n"
|
351
|
-
# "position=70 eof?=true line=This is the third line.\n"
|
352
|
-
#
|
353
|
-
# ## What's Here
|
211
|
+
# Output:
|
354
212
|
#
|
355
|
-
#
|
213
|
+
# "rth line\n"
|
214
|
+
# "Fifth line\n"
|
356
215
|
#
|
357
|
-
#
|
358
|
-
# Object](Object.html#class-Object-label-What-27s+Here).
|
359
|
-
# * Includes [module
|
360
|
-
# Enumerable](Enumerable.html#module-Enumerable-label-What-27s+Here), which
|
361
|
-
# provides dozens of additional methods.
|
216
|
+
# You can write to an IO stream line-by-line using this method:
|
362
217
|
#
|
218
|
+
# * IO#puts: Writes objects to the stream.
|
363
219
|
#
|
364
|
-
# Here, class IO provides methods that are useful for:
|
365
220
|
#
|
366
|
-
#
|
367
|
-
# * [Reading](#class-IO-label-Reading)
|
368
|
-
# * [Writing](#class-IO-label-Writing)
|
369
|
-
# * [Positioning](#class-IO-label-Positioning)
|
370
|
-
# * [Iterating](#class-IO-label-Iterating)
|
371
|
-
# * [Settings](#class-IO-label-Settings)
|
372
|
-
# * [Querying](#class-IO-label-Querying)
|
373
|
-
# * [Buffering](#class-IO-label-Buffering)
|
374
|
-
# * [Low-Level Access](#class-IO-label-Low-Level+Access)
|
375
|
-
# * [Other](#class-IO-label-Other)
|
221
|
+
# ### Line Separator
|
376
222
|
#
|
223
|
+
# Each of these methods uses a *line separator*, which is the string that
|
224
|
+
# delimits lines:
|
377
225
|
#
|
378
|
-
#
|
226
|
+
# * IO.foreach.
|
227
|
+
# * IO.readlines.
|
228
|
+
# * IO#each_line.
|
229
|
+
# * IO#gets.
|
230
|
+
# * IO#readline.
|
231
|
+
# * IO#readlines.
|
379
232
|
#
|
380
|
-
# ::new (aliased as ::for_fd)
|
381
|
-
# : Creates and returns a new IO object for the given integer file
|
382
|
-
# descriptor.
|
383
233
|
#
|
384
|
-
#
|
385
|
-
#
|
234
|
+
# The default line separator is the given by the global variable `$/`, whose
|
235
|
+
# value is by default `"\n"`. The line to be read next is all data from the
|
236
|
+
# current position to the next line separator:
|
386
237
|
#
|
387
|
-
#
|
388
|
-
#
|
238
|
+
# f = File.new('t.txt')
|
239
|
+
# f.gets # => "First line\n"
|
240
|
+
# f.gets # => "Second line\n"
|
241
|
+
# f.gets # => "\n"
|
242
|
+
# f.gets # => "Fourth line\n"
|
243
|
+
# f.gets # => "Fifth line\n"
|
244
|
+
# f.close
|
389
245
|
#
|
390
|
-
#
|
391
|
-
# : Creates an IO object to interact with a subprocess.
|
246
|
+
# You can specify a different line separator:
|
392
247
|
#
|
393
|
-
#
|
394
|
-
#
|
248
|
+
# f = File.new('t.txt')
|
249
|
+
# f.gets('l') # => "First l"
|
250
|
+
# f.gets('li') # => "ine\nSecond li"
|
251
|
+
# f.gets('lin') # => "ne\n\nFourth lin"
|
252
|
+
# f.gets # => "e\n"
|
253
|
+
# f.close
|
395
254
|
#
|
396
|
-
#
|
255
|
+
# There are two special line separators:
|
397
256
|
#
|
257
|
+
# * `nil`: The entire stream is read into a single string:
|
398
258
|
#
|
399
|
-
#
|
259
|
+
# f = File.new('t.txt')
|
260
|
+
# f.gets(nil) # => "First line\nSecond line\n\nFourth line\nFifth line\n"
|
261
|
+
# f.close
|
400
262
|
#
|
401
|
-
#
|
402
|
-
#
|
403
|
-
# file.
|
263
|
+
# * `''` (the empty string): The next "paragraph" is read (paragraphs being
|
264
|
+
# separated by two consecutive line separators):
|
404
265
|
#
|
405
|
-
#
|
406
|
-
#
|
266
|
+
# f = File.new('t.txt')
|
267
|
+
# f.gets('') # => "First line\nSecond line\n\n"
|
268
|
+
# f.gets('') # => "Fourth line\nFifth line\n"
|
269
|
+
# f.close
|
407
270
|
#
|
408
|
-
# ::readlines
|
409
|
-
# : Returns an array of strings, which are the lines from the given file.
|
410
271
|
#
|
411
|
-
#
|
412
|
-
# : Returns the next 8-bit byte read from `self` as an integer.
|
272
|
+
# ### Line Limit
|
413
273
|
#
|
414
|
-
#
|
415
|
-
#
|
274
|
+
# Each of these methods uses a *line limit*, which specifies that the number of
|
275
|
+
# bytes returned may not be (much) longer than the given `limit`;
|
416
276
|
#
|
417
|
-
#
|
418
|
-
#
|
277
|
+
# * IO.foreach.
|
278
|
+
# * IO.readlines.
|
279
|
+
# * IO#each_line.
|
280
|
+
# * IO#gets.
|
281
|
+
# * IO#readline.
|
282
|
+
# * IO#readlines.
|
419
283
|
#
|
420
|
-
# #pread
|
421
|
-
# : Returns all or the next *n* bytes read from `self`, not updating the
|
422
|
-
# receiver's offset.
|
423
284
|
#
|
424
|
-
#
|
425
|
-
#
|
426
|
-
# given *n*.
|
285
|
+
# A multi-byte character will not be split, and so a line may be slightly longer
|
286
|
+
# than the given limit.
|
427
287
|
#
|
428
|
-
#
|
429
|
-
# : the next *n* bytes read from `self` for a given *n*, in non-block
|
430
|
-
# mode.
|
288
|
+
# If `limit` is not given, the line is determined only by `sep`.
|
431
289
|
#
|
432
|
-
# #
|
433
|
-
#
|
434
|
-
#
|
290
|
+
# # Text with 1-byte characters.
|
291
|
+
# File.open('t.txt') {|f| f.gets(1) } # => "F"
|
292
|
+
# File.open('t.txt') {|f| f.gets(2) } # => "Fi"
|
293
|
+
# File.open('t.txt') {|f| f.gets(3) } # => "Fir"
|
294
|
+
# File.open('t.txt') {|f| f.gets(4) } # => "Firs"
|
295
|
+
# # No more than one line.
|
296
|
+
# File.open('t.txt') {|f| f.gets(10) } # => "First line"
|
297
|
+
# File.open('t.txt') {|f| f.gets(11) } # => "First line\n"
|
298
|
+
# File.open('t.txt') {|f| f.gets(12) } # => "First line\n"
|
435
299
|
#
|
436
|
-
# #
|
437
|
-
#
|
438
|
-
#
|
300
|
+
# # Text with 2-byte characters, which will not be split.
|
301
|
+
# File.open('t.rus') {|f| f.gets(1).size } # => 1
|
302
|
+
# File.open('t.rus') {|f| f.gets(2).size } # => 1
|
303
|
+
# File.open('t.rus') {|f| f.gets(3).size } # => 2
|
304
|
+
# File.open('t.rus') {|f| f.gets(4).size } # => 2
|
439
305
|
#
|
440
|
-
#
|
441
|
-
# : Returns the next line read from `self`; same as #getline, but raises
|
442
|
-
# an exception of end-of-file.
|
306
|
+
# ### Line Separator and Line Limit
|
443
307
|
#
|
444
|
-
#
|
445
|
-
# : Returns an array of all lines read read from `self`.
|
308
|
+
# With arguments `sep` and `limit` given, combines the two behaviors:
|
446
309
|
#
|
447
|
-
#
|
448
|
-
#
|
310
|
+
# * Returns the next line as determined by line separator `sep`.
|
311
|
+
# * But returns no more bytes than are allowed by the limit.
|
449
312
|
#
|
450
313
|
#
|
314
|
+
# Example:
|
451
315
|
#
|
452
|
-
#
|
316
|
+
# File.open('t.txt') {|f| f.gets('li', 20) } # => "First li"
|
317
|
+
# File.open('t.txt') {|f| f.gets('li', 2) } # => "Fi"
|
453
318
|
#
|
454
|
-
#
|
455
|
-
# : Writes the given string to the file at the given filepath, in binary
|
456
|
-
# mode.
|
319
|
+
# ### Line Number
|
457
320
|
#
|
458
|
-
#
|
459
|
-
# : Writes the given string to `self`.
|
321
|
+
# A readable IO stream has a non-negative integer *line number*.
|
460
322
|
#
|
461
|
-
#
|
462
|
-
# : Appends the given string to `self`.
|
323
|
+
# The relevant methods:
|
463
324
|
#
|
464
|
-
#
|
465
|
-
#
|
325
|
+
# * IO#lineno: Returns the line number.
|
326
|
+
# * IO#lineno=: Resets and returns the line number.
|
466
327
|
#
|
467
|
-
# #printf
|
468
|
-
# : Writes to `self` based on the given format string and objects.
|
469
328
|
#
|
470
|
-
#
|
471
|
-
#
|
329
|
+
# Unless modified by a call to method IO#lineno=, the line number is the number
|
330
|
+
# of lines read by certain line-oriented methods, according to the given line
|
331
|
+
# separator `sep`:
|
472
332
|
#
|
473
|
-
#
|
474
|
-
# :
|
333
|
+
# * IO.foreach: Increments the line number on each call to the block.
|
334
|
+
# * IO#each_line: Increments the line number on each call to the block.
|
335
|
+
# * IO#gets: Increments the line number.
|
336
|
+
# * IO#readline: Increments the line number.
|
337
|
+
# * IO#readlines: Increments the line number for each line read.
|
475
338
|
#
|
476
|
-
# #pwrite
|
477
|
-
# : Writes the given string at the given offset, not updating the
|
478
|
-
# receiver's offset.
|
479
339
|
#
|
480
|
-
#
|
481
|
-
#
|
340
|
+
# A new stream is initially has line number zero (and position zero); method
|
341
|
+
# `rewind` resets the line number (and position) to zero:
|
482
342
|
#
|
483
|
-
#
|
484
|
-
#
|
343
|
+
# f = File.new('t.txt')
|
344
|
+
# f.lineno # => 0
|
345
|
+
# f.gets # => "First line\n"
|
346
|
+
# f.lineno # => 1
|
347
|
+
# f.rewind
|
348
|
+
# f.lineno # => 0
|
349
|
+
# f.close
|
485
350
|
#
|
351
|
+
# Reading lines from a stream usually changes its line number:
|
486
352
|
#
|
353
|
+
# f = File.new('t.txt', 'r')
|
354
|
+
# f.lineno # => 0
|
355
|
+
# f.readline # => "This is line one.\n"
|
356
|
+
# f.lineno # => 1
|
357
|
+
# f.readline # => "This is the second line.\n"
|
358
|
+
# f.lineno # => 2
|
359
|
+
# f.readline # => "Here's the third line.\n"
|
360
|
+
# f.lineno # => 3
|
361
|
+
# f.eof? # => true
|
362
|
+
# f.close
|
487
363
|
#
|
488
|
-
#
|
364
|
+
# Iterating over lines in a stream usually changes its line number:
|
489
365
|
#
|
490
|
-
#
|
491
|
-
#
|
366
|
+
# File.open('t.txt') do |f|
|
367
|
+
# f.each_line do |line|
|
368
|
+
# p "position=#{f.pos} eof?=#{f.eof?} lineno=#{f.lineno}"
|
369
|
+
# end
|
370
|
+
# end
|
492
371
|
#
|
493
|
-
#
|
494
|
-
# : Sets the line number is `self`.
|
372
|
+
# Output:
|
495
373
|
#
|
496
|
-
#
|
497
|
-
#
|
374
|
+
# "position=11 eof?=false lineno=1"
|
375
|
+
# "position=23 eof?=false lineno=2"
|
376
|
+
# "position=24 eof?=false lineno=3"
|
377
|
+
# "position=36 eof?=false lineno=4"
|
378
|
+
# "position=47 eof?=true lineno=5"
|
498
379
|
#
|
499
|
-
#
|
500
|
-
#
|
380
|
+
# Unlike the stream's [position](rdoc-ref:IO@Position), the line number does not
|
381
|
+
# affect where the next read or write will occur:
|
501
382
|
#
|
502
|
-
#
|
503
|
-
#
|
383
|
+
# f = File.new('t.txt')
|
384
|
+
# f.lineno = 1000
|
385
|
+
# f.lineno # => 1000
|
386
|
+
# f.gets # => "First line\n"
|
387
|
+
# f.lineno # => 1001
|
388
|
+
# f.close
|
504
389
|
#
|
505
|
-
#
|
506
|
-
# : Positions `self` to the beginning of input.
|
390
|
+
# Associated with the line number is the global variable `$.`:
|
507
391
|
#
|
508
|
-
#
|
509
|
-
#
|
392
|
+
# * When a stream is opened, `$.` is not set; its value is left over from
|
393
|
+
# previous activity in the process:
|
510
394
|
#
|
395
|
+
# $. = 41
|
396
|
+
# f = File.new('t.txt')
|
397
|
+
# $. = 41
|
398
|
+
# # => 41
|
399
|
+
# f.close
|
511
400
|
#
|
401
|
+
# * When a stream is read, `#.` is set to the line number for that stream:
|
402
|
+
#
|
403
|
+
# f0 = File.new('t.txt')
|
404
|
+
# f1 = File.new('t.dat')
|
405
|
+
# f0.readlines # => ["First line\n", "Second line\n", "\n", "Fourth line\n", "Fifth line\n"]
|
406
|
+
# $. # => 5
|
407
|
+
# f1.readlines # => ["\xFE\xFF\x99\x90\x99\x91\x99\x92\x99\x93\x99\x94"]
|
408
|
+
# $. # => 1
|
409
|
+
# f0.close
|
410
|
+
# f1.close
|
411
|
+
#
|
412
|
+
# * Methods IO#rewind and IO#seek do not affect `$.`:
|
413
|
+
#
|
414
|
+
# f = File.new('t.txt')
|
415
|
+
# f.readlines # => ["First line\n", "Second line\n", "\n", "Fourth line\n", "Fifth line\n"]
|
416
|
+
# $. # => 5
|
417
|
+
# f.rewind
|
418
|
+
# f.seek(0, :SET)
|
419
|
+
# $. # => 5
|
420
|
+
# f.close
|
512
421
|
#
|
513
|
-
# ### Iterating
|
514
422
|
#
|
515
|
-
#
|
516
|
-
# : Yields each line of given file to the block.
|
423
|
+
# ## Character IO
|
517
424
|
#
|
518
|
-
#
|
519
|
-
# : Calls the given block with each successive line in `self`.
|
425
|
+
# You can process an IO stream character-by-character using these methods:
|
520
426
|
#
|
521
|
-
#
|
522
|
-
# :
|
523
|
-
#
|
427
|
+
# * IO#getc: Reads and returns the next character from the stream.
|
428
|
+
# * IO#readchar: Like #getc, but raises an exception at end-of-stream.
|
429
|
+
# * IO#ungetc: Pushes back ("unshifts") a character or integer onto the
|
430
|
+
# stream.
|
431
|
+
# * IO#putc: Writes a character to the stream.
|
432
|
+
# * IO#each_char: Reads each remaining character in the stream, passing the
|
433
|
+
# character to the given block.
|
524
434
|
#
|
525
|
-
#
|
526
|
-
# : Calls the given block with each successive character in `self` as a
|
527
|
-
# string.
|
435
|
+
# ## Byte IO
|
528
436
|
#
|
529
|
-
#
|
530
|
-
# : Calls the given block with each successive codepoint in `self` as an
|
531
|
-
# integer.
|
437
|
+
# You can process an IO stream byte-by-byte using these methods:
|
532
438
|
#
|
439
|
+
# * IO#getbyte: Returns the next 8-bit byte as an integer in range 0..255.
|
440
|
+
# * IO#readbyte: Like #getbyte, but raises an exception if at end-of-stream.
|
441
|
+
# * IO#ungetbyte: Pushes back ("unshifts") a byte back onto the stream.
|
442
|
+
# * IO#each_byte: Reads each remaining byte in the stream, passing the byte to
|
443
|
+
# the given block.
|
533
444
|
#
|
534
445
|
#
|
535
|
-
#
|
446
|
+
# ## Codepoint IO
|
536
447
|
#
|
537
|
-
#
|
538
|
-
# : Sets whether `self` auto-closes.
|
448
|
+
# You can process an IO stream codepoint-by-codepoint:
|
539
449
|
#
|
540
|
-
#
|
541
|
-
#
|
450
|
+
# * IO#each_codepoint: Reads each remaining codepoint, passing it to the given
|
451
|
+
# block.
|
542
452
|
#
|
543
|
-
# #close
|
544
|
-
# : Closes `self`.
|
545
453
|
#
|
546
|
-
#
|
547
|
-
# : Sets the close-on-exec flag.
|
454
|
+
# ## What's Here
|
548
455
|
#
|
549
|
-
#
|
550
|
-
# : Closes `self` for reading.
|
456
|
+
# First, what's elsewhere. Class IO:
|
551
457
|
#
|
552
|
-
#
|
553
|
-
#
|
458
|
+
# * Inherits from [class Object](rdoc-ref:Object@What-27s+Here).
|
459
|
+
# * Includes [module Enumerable](rdoc-ref:Enumerable@What-27s+Here), which
|
460
|
+
# provides dozens of additional methods.
|
554
461
|
#
|
555
|
-
# #set_encoding
|
556
|
-
# : Sets the encoding for `self`.
|
557
462
|
#
|
558
|
-
#
|
559
|
-
# : Sets the encoding for `self`, based on its Unicode byte-order-mark.
|
463
|
+
# Here, class IO provides methods that are useful for:
|
560
464
|
#
|
561
|
-
#
|
562
|
-
# :
|
465
|
+
# * [Creating](rdoc-ref:IO@Creating)
|
466
|
+
# * [Reading](rdoc-ref:IO@Reading)
|
467
|
+
# * [Writing](rdoc-ref:IO@Writing)
|
468
|
+
# * [Positioning](rdoc-ref:IO@Positioning)
|
469
|
+
# * [Iterating](rdoc-ref:IO@Iterating)
|
470
|
+
# * [Settings](rdoc-ref:IO@Settings)
|
471
|
+
# * [Querying](rdoc-ref:IO@Querying)
|
472
|
+
# * [Buffering](rdoc-ref:IO@Buffering)
|
473
|
+
# * [Low-Level Access](rdoc-ref:IO@Low-Level+Access)
|
474
|
+
# * [Other](rdoc-ref:IO@Other)
|
563
475
|
#
|
564
476
|
#
|
477
|
+
# ### Creating
|
565
478
|
#
|
566
|
-
#
|
479
|
+
# * ::new (aliased as ::for_fd): Creates and returns a new IO object for the
|
480
|
+
# given integer file descriptor.
|
481
|
+
# * ::open: Creates a new IO object.
|
482
|
+
# * ::pipe: Creates a connected pair of reader and writer IO objects.
|
483
|
+
# * ::popen: Creates an IO object to interact with a subprocess.
|
484
|
+
# * ::select: Selects which given IO instances are ready for reading, writing,
|
485
|
+
# or have pending exceptions.
|
567
486
|
#
|
568
|
-
# #autoclose?
|
569
|
-
# : Returns whether `self` auto-closes.
|
570
487
|
#
|
571
|
-
#
|
572
|
-
# : Returns whether `self` is in binary mode.
|
488
|
+
# ### Reading
|
573
489
|
#
|
574
|
-
#
|
575
|
-
#
|
490
|
+
# * ::binread: Returns a binary string with all or a subset of bytes from the
|
491
|
+
# given file.
|
492
|
+
# * ::read: Returns a string with all or a subset of bytes from the given
|
493
|
+
# file.
|
494
|
+
# * ::readlines: Returns an array of strings, which are the lines from the
|
495
|
+
# given file.
|
496
|
+
# * #getbyte: Returns the next 8-bit byte read from `self` as an integer.
|
497
|
+
# * #getc: Returns the next character read from `self` as a string.
|
498
|
+
# * #gets: Returns the line read from `self`.
|
499
|
+
# * #pread: Returns all or the next *n* bytes read from `self`, not updating
|
500
|
+
# the receiver's offset.
|
501
|
+
# * #read: Returns all remaining or the next *n* bytes read from `self` for a
|
502
|
+
# given *n*.
|
503
|
+
# * #read_nonblock: the next *n* bytes read from `self` for a given *n*, in
|
504
|
+
# non-block mode.
|
505
|
+
# * #readbyte: Returns the next byte read from `self`; same as #getbyte, but
|
506
|
+
# raises an exception on end-of-stream.
|
507
|
+
# * #readchar: Returns the next character read from `self`; same as #getc, but
|
508
|
+
# raises an exception on end-of-stream.
|
509
|
+
# * #readline: Returns the next line read from `self`; same as #getline, but
|
510
|
+
# raises an exception of end-of-stream.
|
511
|
+
# * #readlines: Returns an array of all lines read read from `self`.
|
512
|
+
# * #readpartial: Returns up to the given number of bytes from `self`.
|
576
513
|
#
|
577
|
-
# #closed?
|
578
|
-
# : Returns whether `self` is closed.
|
579
514
|
#
|
580
|
-
#
|
581
|
-
# : Returns whether `self` is at end-of-file.
|
515
|
+
# ### Writing
|
582
516
|
#
|
583
|
-
#
|
584
|
-
#
|
517
|
+
# * ::binwrite: Writes the given string to the file at the given filepath, in
|
518
|
+
# binary mode.
|
519
|
+
# * ::write: Writes the given string to `self`.
|
520
|
+
# * #<<: Appends the given string to `self`.
|
521
|
+
# * #print: Prints last read line or given objects to `self`.
|
522
|
+
# * #printf: Writes to `self` based on the given format string and objects.
|
523
|
+
# * #putc: Writes a character to `self`.
|
524
|
+
# * #puts: Writes lines to `self`, making sure line ends with a newline.
|
525
|
+
# * #pwrite: Writes the given string at the given offset, not updating the
|
526
|
+
# receiver's offset.
|
527
|
+
# * #write: Writes one or more given strings to `self`.
|
528
|
+
# * #write_nonblock: Writes one or more given strings to `self` in
|
529
|
+
# non-blocking mode.
|
585
530
|
#
|
586
|
-
# #fileno (aliased as #to_i)
|
587
|
-
# : Returns the integer file descriptor for `self`
|
588
531
|
#
|
589
|
-
#
|
590
|
-
# : Returns the internal encoding object for `self`.
|
532
|
+
# ### Positioning
|
591
533
|
#
|
592
|
-
#
|
593
|
-
#
|
594
|
-
#
|
534
|
+
# * #lineno: Returns the current line number in `self`.
|
535
|
+
# * #lineno=: Sets the line number is `self`.
|
536
|
+
# * #pos (aliased as #tell): Returns the current byte offset in `self`.
|
537
|
+
# * #pos=: Sets the byte offset in `self`.
|
538
|
+
# * #reopen: Reassociates `self` with a new or existing IO stream.
|
539
|
+
# * #rewind: Positions `self` to the beginning of input.
|
540
|
+
# * #seek: Sets the offset for `self` relative to given position.
|
595
541
|
#
|
596
|
-
# #stat
|
597
|
-
# : Returns the File::Stat object containing status information for
|
598
|
-
# `self`.
|
599
542
|
#
|
600
|
-
#
|
601
|
-
# : Returns whether `self` is in sync-mode.
|
543
|
+
# ### Iterating
|
602
544
|
#
|
603
|
-
#
|
604
|
-
# :
|
545
|
+
# * ::foreach: Yields each line of given file to the block.
|
546
|
+
# * #each (aliased as #each_line): Calls the given block with each successive
|
547
|
+
# line in `self`.
|
548
|
+
# * #each_byte: Calls the given block with each successive byte in `self` as
|
549
|
+
# an integer.
|
550
|
+
# * #each_char: Calls the given block with each successive character in `self`
|
551
|
+
# as a string.
|
552
|
+
# * #each_codepoint: Calls the given block with each successive codepoint in
|
553
|
+
# `self` as an integer.
|
605
554
|
#
|
606
555
|
#
|
556
|
+
# ### Settings
|
607
557
|
#
|
608
|
-
#
|
558
|
+
# * #autoclose=: Sets whether `self` auto-closes.
|
559
|
+
# * #binmode: Sets `self` to binary mode.
|
560
|
+
# * #close: Closes `self`.
|
561
|
+
# * #close_on_exec=: Sets the close-on-exec flag.
|
562
|
+
# * #close_read: Closes `self` for reading.
|
563
|
+
# * #close_write: Closes `self` for writing.
|
564
|
+
# * #set_encoding: Sets the encoding for `self`.
|
565
|
+
# * #set_encoding_by_bom: Sets the encoding for `self`, based on its Unicode
|
566
|
+
# byte-order-mark.
|
567
|
+
# * #sync=: Sets the sync-mode to the given value.
|
609
568
|
#
|
610
|
-
# #fdatasync
|
611
|
-
# : Immediately writes all buffered data in `self` to disk.
|
612
569
|
#
|
613
|
-
#
|
614
|
-
# : Flushes any buffered data within `self` to the underlying operating
|
615
|
-
# system.
|
570
|
+
# ### Querying
|
616
571
|
#
|
617
|
-
#
|
618
|
-
#
|
572
|
+
# * #autoclose?: Returns whether `self` auto-closes.
|
573
|
+
# * #binmode?: Returns whether `self` is in binary mode.
|
574
|
+
# * #close_on_exec?: Returns the close-on-exec flag for `self`.
|
575
|
+
# * #closed?: Returns whether `self` is closed.
|
576
|
+
# * #eof? (aliased as #eof): Returns whether `self` is at end-of-stream.
|
577
|
+
# * #external_encoding: Returns the external encoding object for `self`.
|
578
|
+
# * #fileno (aliased as #to_i): Returns the integer file descriptor for `self`
|
579
|
+
# * #internal_encoding: Returns the internal encoding object for `self`.
|
580
|
+
# * #pid: Returns the process ID of a child process associated with `self`, if
|
581
|
+
# `self` was created by ::popen.
|
582
|
+
# * #stat: Returns the File::Stat object containing status information for
|
583
|
+
# `self`.
|
584
|
+
# * #sync: Returns whether `self` is in sync-mode.
|
585
|
+
# * #tty? (aliased as #isatty): Returns whether `self` is a terminal.
|
619
586
|
#
|
620
|
-
# #ungetbyte
|
621
|
-
# : Prepends buffer for `self` with given integer byte or string.
|
622
587
|
#
|
623
|
-
#
|
624
|
-
# : Prepends buffer for `self` with given string.
|
588
|
+
# ### Buffering
|
625
589
|
#
|
590
|
+
# * #fdatasync: Immediately writes all buffered data in `self` to disk.
|
591
|
+
# * #flush: Flushes any buffered data within `self` to the underlying
|
592
|
+
# operating system.
|
593
|
+
# * #fsync: Immediately writes all buffered data and attributes in `self` to
|
594
|
+
# disk.
|
595
|
+
# * #ungetbyte: Prepends buffer for `self` with given integer byte or string.
|
596
|
+
# * #ungetc: Prepends buffer for `self` with given string.
|
626
597
|
#
|
627
598
|
#
|
628
599
|
# ### Low-Level Access
|
629
600
|
#
|
630
|
-
#
|
631
|
-
#
|
632
|
-
#
|
633
|
-
#
|
634
|
-
#
|
635
|
-
#
|
636
|
-
#
|
637
|
-
#
|
638
|
-
# :
|
639
|
-
#
|
640
|
-
#
|
641
|
-
#
|
642
|
-
# : Passes a low-level command to the device specified by the given file
|
643
|
-
# descriptor.
|
644
|
-
#
|
645
|
-
# #sysread
|
646
|
-
# : Returns up to the next *n* bytes read from self using a low-level
|
647
|
-
# read.
|
648
|
-
#
|
649
|
-
# #sysseek
|
650
|
-
# : Sets the offset for `self`.
|
651
|
-
#
|
652
|
-
# #syswrite
|
653
|
-
# : Writes the given string to `self` using a low-level write.
|
654
|
-
#
|
601
|
+
# * ::sysopen: Opens the file given by its path, returning the integer file
|
602
|
+
# descriptor.
|
603
|
+
# * #advise: Announces the intention to access data from `self` in a specific
|
604
|
+
# way.
|
605
|
+
# * #fcntl: Passes a low-level command to the file specified by the given file
|
606
|
+
# descriptor.
|
607
|
+
# * #ioctl: Passes a low-level command to the device specified by the given
|
608
|
+
# file descriptor.
|
609
|
+
# * #sysread: Returns up to the next *n* bytes read from self using a
|
610
|
+
# low-level read.
|
611
|
+
# * #sysseek: Sets the offset for `self`.
|
612
|
+
# * #syswrite: Writes the given string to `self` using a low-level write.
|
655
613
|
#
|
656
614
|
#
|
657
615
|
# ### Other
|
658
616
|
#
|
659
|
-
#
|
660
|
-
#
|
661
|
-
#
|
662
|
-
#
|
663
|
-
#
|
664
|
-
# : Returns a new IO object resulting from converting the given object.
|
665
|
-
#
|
666
|
-
# #inspect
|
667
|
-
# : Returns the string representation of `self`.
|
617
|
+
# * ::copy_stream: Copies data from a source to a destination, each of which
|
618
|
+
# is a filepath or an IO-like object.
|
619
|
+
# * ::try_convert: Returns a new IO object resulting from converting the given
|
620
|
+
# object.
|
621
|
+
# * #inspect: Returns the string representation of `self`.
|
668
622
|
#
|
669
623
|
%a{annotate:rdoc:source:from=io.c}
|
670
624
|
class IO < Object
|
@@ -677,8 +631,8 @@ class IO < Object
|
|
677
631
|
# - self << object -> self
|
678
632
|
# -->
|
679
633
|
# Writes the given `object` to `self`, which must be opened for writing (see
|
680
|
-
# [Modes](
|
681
|
-
# it is converted via method `to_s`:
|
634
|
+
# [Access Modes](rdoc-ref:File@Access+Modes)); returns `self`; if `object` is
|
635
|
+
# not a string, it is converted via method `to_s`:
|
682
636
|
#
|
683
637
|
# $stdout << 'Hello' << ', ' << 'World!' << "\n"
|
684
638
|
# $stdout << 'foo' << :bar << 2 << "\n"
|
@@ -692,56 +646,35 @@ class IO < Object
|
|
692
646
|
|
693
647
|
# <!--
|
694
648
|
# rdoc-file=io.c
|
695
|
-
# -
|
649
|
+
# - advise(advice, offset = 0, len = 0) -> nil
|
696
650
|
# -->
|
697
|
-
#
|
698
|
-
#
|
699
|
-
#
|
651
|
+
# Invokes Posix system call
|
652
|
+
# [posix_fadvise(2)](https://linux.die.net/man/2/posix_fadvise), which announces
|
653
|
+
# an intention to access data from the current file in a particular manner.
|
700
654
|
#
|
701
|
-
#
|
655
|
+
# The arguments and results are platform-dependent.
|
702
656
|
#
|
703
|
-
# :
|
704
|
-
# : No advice to give; the default assumption for an open file.
|
705
|
-
# :sequential
|
706
|
-
# : The data will be accessed sequentially with lower offsets read before
|
707
|
-
# higher ones.
|
708
|
-
# :random
|
709
|
-
# : The data will be accessed in random order.
|
710
|
-
# :willneed
|
711
|
-
# : The data will be accessed in the near future.
|
712
|
-
# :dontneed
|
713
|
-
# : The data will not be accessed in the near future.
|
714
|
-
# :noreuse
|
715
|
-
# : The data will only be accessed once.
|
657
|
+
# The relevant data is specified by:
|
716
658
|
#
|
659
|
+
# * `offset`: The offset of the first byte of data.
|
660
|
+
# * `len`: The number of bytes to be accessed; if `len` is zero, or is larger
|
661
|
+
# than the number of bytes remaining, all remaining bytes will be accessed.
|
717
662
|
#
|
718
|
-
# The semantics of a piece of advice are platform-dependent. See *man 2
|
719
|
-
# posix_fadvise* for details.
|
720
663
|
#
|
721
|
-
#
|
722
|
-
# extends for *len* bytes. If *len* is 0, the region ends at the last byte of
|
723
|
-
# the file. By default, both *offset* and *len* are 0, meaning that the advice
|
724
|
-
# applies to the entire file.
|
664
|
+
# Argument `advice` is one of the following symbols:
|
725
665
|
#
|
726
|
-
#
|
666
|
+
# * `:normal`: The application has no advice to give about its access pattern
|
667
|
+
# for the specified data. If no advice is given for an open file, this is
|
668
|
+
# the default assumption.
|
669
|
+
# * `:sequential`: The application expects to access the specified data
|
670
|
+
# sequentially (with lower offsets read before higher ones).
|
671
|
+
# * `:random`: The specified data will be accessed in random order.
|
672
|
+
# * `:noreuse`: The specified data will be accessed only once.
|
673
|
+
# * `:willneed`: The specified data will be accessed in the near future.
|
674
|
+
# * `:dontneed`: The specified data will not be accessed in the near future.
|
727
675
|
#
|
728
|
-
# IOError
|
729
|
-
# : The IO stream is closed.
|
730
|
-
# Errno::EBADF
|
731
|
-
# : The file descriptor of the current file is invalid.
|
732
|
-
# Errno::EINVAL
|
733
|
-
# : An invalid value for *advice* was given.
|
734
|
-
# Errno::ESPIPE
|
735
|
-
# : The file descriptor of the current file refers to a FIFO or pipe. (Linux
|
736
|
-
# raises Errno::EINVAL in this case).
|
737
|
-
# TypeError
|
738
|
-
# : Either *advice* was not a Symbol, or one of the other arguments was not an
|
739
|
-
# Integer.
|
740
|
-
# RangeError
|
741
|
-
# : One of the arguments given was too big/small.
|
742
676
|
#
|
743
|
-
#
|
744
|
-
# : exceptions are also possible.
|
677
|
+
# Not implemented on all platforms.
|
745
678
|
#
|
746
679
|
def advise: (:normal | :sequential | :random | :willneed | :dontneed | :noreuse advise, ?Integer offset, ?Integer len) -> nil
|
747
680
|
|
@@ -774,43 +707,60 @@ class IO < Object
|
|
774
707
|
|
775
708
|
# <!--
|
776
709
|
# rdoc-file=io.c
|
777
|
-
# -
|
710
|
+
# - binmode -> self
|
778
711
|
# -->
|
779
|
-
#
|
780
|
-
#
|
712
|
+
# Sets the stream's data mode as binary (see [Data
|
713
|
+
# Mode](rdoc-ref:File@Data+Mode)).
|
781
714
|
#
|
782
|
-
#
|
783
|
-
# * encoding conversion disabled
|
784
|
-
# * content is treated as ASCII-8BIT
|
715
|
+
# A stream's data mode may not be changed from binary to text.
|
785
716
|
#
|
786
717
|
def binmode: () -> self
|
787
718
|
|
788
719
|
# <!--
|
789
720
|
# rdoc-file=io.c
|
790
|
-
# -
|
721
|
+
# - binmode? -> true or false
|
791
722
|
# -->
|
792
|
-
# Returns `true` if
|
723
|
+
# Returns `true` if the stream is on binary mode, `false` otherwise. See [Data
|
724
|
+
# Mode](rdoc-ref:File@Data+Mode).
|
793
725
|
#
|
794
726
|
def binmode?: () -> bool
|
795
727
|
|
796
728
|
# <!--
|
797
729
|
# rdoc-file=io.c
|
798
|
-
# -
|
730
|
+
# - close -> nil
|
799
731
|
# -->
|
800
|
-
# Closes
|
801
|
-
#
|
802
|
-
#
|
803
|
-
#
|
732
|
+
# Closes the stream for both reading and writing if open for either or both;
|
733
|
+
# returns `nil`. See [Open and Closed
|
734
|
+
# Streams](rdoc-ref:IO@Open+and+Closed+Streams).
|
735
|
+
#
|
736
|
+
# If the stream is open for writing, flushes any buffered writes to the
|
737
|
+
# operating system before closing.
|
804
738
|
#
|
805
|
-
# If
|
739
|
+
# If the stream was opened by IO.popen, sets global variable `$?` (child exit
|
740
|
+
# status).
|
806
741
|
#
|
807
|
-
#
|
742
|
+
# Example:
|
743
|
+
#
|
744
|
+
# IO.popen('ruby', 'r+') do |pipe|
|
745
|
+
# puts pipe.closed?
|
746
|
+
# pipe.close
|
747
|
+
# puts $?
|
748
|
+
# puts pipe.closed?
|
749
|
+
# end
|
750
|
+
#
|
751
|
+
# Output:
|
752
|
+
#
|
753
|
+
# false
|
754
|
+
# pid 13760 exit 0
|
755
|
+
# true
|
756
|
+
#
|
757
|
+
# Related: IO#close_read, IO#close_write, IO#closed?.
|
808
758
|
#
|
809
759
|
def close: () -> NilClass
|
810
760
|
|
811
761
|
# <!--
|
812
762
|
# rdoc-file=io.c
|
813
|
-
# -
|
763
|
+
# - self.close_on_exec = bool -> true or false
|
814
764
|
# -->
|
815
765
|
# Sets a close-on-exec flag.
|
816
766
|
#
|
@@ -829,157 +779,272 @@ class IO < Object
|
|
829
779
|
|
830
780
|
# <!--
|
831
781
|
# rdoc-file=io.c
|
832
|
-
# -
|
782
|
+
# - close_on_exec? -> true or false
|
833
783
|
# -->
|
834
|
-
# Returns `true` if
|
784
|
+
# Returns `true` if the stream will be closed on exec, `false` otherwise:
|
835
785
|
#
|
836
|
-
# f = open(
|
837
|
-
# f.close_on_exec?
|
838
|
-
# f.close_on_exec = true
|
839
|
-
# f.close_on_exec? #=> true
|
786
|
+
# f = File.open('t.txt')
|
787
|
+
# f.close_on_exec? # => true
|
840
788
|
# f.close_on_exec = false
|
841
|
-
# f.close_on_exec?
|
789
|
+
# f.close_on_exec? # => false
|
790
|
+
# f.close
|
842
791
|
#
|
843
792
|
def close_on_exec?: () -> bool
|
844
793
|
|
845
794
|
# <!--
|
846
795
|
# rdoc-file=io.c
|
847
|
-
# -
|
796
|
+
# - close_read -> nil
|
848
797
|
# -->
|
849
|
-
# Closes the
|
850
|
-
#
|
851
|
-
# is not duplexed.
|
798
|
+
# Closes the stream for reading if open for reading; returns `nil`. See [Open
|
799
|
+
# and Closed Streams](rdoc-ref:IO@Open+and+Closed+Streams).
|
852
800
|
#
|
853
|
-
#
|
854
|
-
#
|
855
|
-
# f.readlines
|
801
|
+
# If the stream was opened by IO.popen and is also closed for writing, sets
|
802
|
+
# global variable `$?` (child exit status).
|
856
803
|
#
|
857
|
-
#
|
804
|
+
# Example:
|
858
805
|
#
|
859
|
-
#
|
860
|
-
#
|
806
|
+
# IO.popen('ruby', 'r+') do |pipe|
|
807
|
+
# puts pipe.closed?
|
808
|
+
# pipe.close_write
|
809
|
+
# puts pipe.closed?
|
810
|
+
# pipe.close_read
|
811
|
+
# puts $?
|
812
|
+
# puts pipe.closed?
|
813
|
+
# end
|
861
814
|
#
|
862
|
-
#
|
815
|
+
# Output:
|
816
|
+
#
|
817
|
+
# false
|
818
|
+
# false
|
819
|
+
# pid 14748 exit 0
|
820
|
+
# true
|
821
|
+
#
|
822
|
+
# Related: IO#close, IO#close_write, IO#closed?.
|
863
823
|
#
|
864
824
|
def close_read: () -> NilClass
|
865
825
|
|
866
826
|
# <!--
|
867
827
|
# rdoc-file=io.c
|
868
|
-
# -
|
828
|
+
# - close_write -> nil
|
869
829
|
# -->
|
870
|
-
# Closes the
|
871
|
-
#
|
872
|
-
# is not duplexed.
|
830
|
+
# Closes the stream for writing if open for writing; returns `nil`. See [Open
|
831
|
+
# and Closed Streams](rdoc-ref:IO@Open+and+Closed+Streams).
|
873
832
|
#
|
874
|
-
#
|
875
|
-
# f.close_write
|
876
|
-
# f.print "nowhere"
|
833
|
+
# Flushes any buffered writes to the operating system before closing.
|
877
834
|
#
|
878
|
-
#
|
835
|
+
# If the stream was opened by IO.popen and is also closed for reading, sets
|
836
|
+
# global variable `$?` (child exit status).
|
879
837
|
#
|
880
|
-
#
|
881
|
-
#
|
882
|
-
#
|
838
|
+
# IO.popen('ruby', 'r+') do |pipe|
|
839
|
+
# puts pipe.closed?
|
840
|
+
# pipe.close_read
|
841
|
+
# puts pipe.closed?
|
842
|
+
# pipe.close_write
|
843
|
+
# puts $?
|
844
|
+
# puts pipe.closed?
|
845
|
+
# end
|
883
846
|
#
|
884
|
-
#
|
847
|
+
# Output:
|
848
|
+
#
|
849
|
+
# false
|
850
|
+
# false
|
851
|
+
# pid 15044 exit 0
|
852
|
+
# true
|
853
|
+
#
|
854
|
+
# Related: IO#close, IO#close_read, IO#closed?.
|
885
855
|
#
|
886
856
|
def close_write: () -> NilClass
|
887
857
|
|
888
858
|
# <!--
|
889
859
|
# rdoc-file=io.c
|
890
|
-
# -
|
860
|
+
# - closed? -> true or false
|
891
861
|
# -->
|
892
|
-
# Returns `true` if
|
893
|
-
# and
|
862
|
+
# Returns `true` if the stream is closed for both reading and writing, `false`
|
863
|
+
# otherwise. See [Open and Closed Streams](rdoc-ref:IO@Open+and+Closed+Streams).
|
894
864
|
#
|
895
|
-
#
|
896
|
-
#
|
897
|
-
#
|
898
|
-
#
|
899
|
-
#
|
900
|
-
#
|
901
|
-
#
|
902
|
-
#
|
865
|
+
# IO.popen('ruby', 'r+') do |pipe|
|
866
|
+
# puts pipe.closed?
|
867
|
+
# pipe.close_read
|
868
|
+
# puts pipe.closed?
|
869
|
+
# pipe.close_write
|
870
|
+
# puts pipe.closed?
|
871
|
+
# end
|
872
|
+
#
|
873
|
+
# Output:
|
874
|
+
#
|
875
|
+
# false
|
876
|
+
# false
|
877
|
+
# true
|
878
|
+
#
|
879
|
+
# Related: IO#close_read, IO#close_write, IO#close.
|
903
880
|
#
|
904
881
|
def closed?: () -> bool
|
905
882
|
|
906
883
|
# <!--
|
907
884
|
# rdoc-file=io.c
|
908
|
-
# -
|
909
|
-
# -
|
910
|
-
# -
|
911
|
-
# -
|
912
|
-
# - ios.each_line(sep=$/ [, getline_args]) {|line| block } -> ios
|
913
|
-
# - ios.each_line(limit [, getline_args]) {|line| block } -> ios
|
914
|
-
# - ios.each_line(sep, limit [, getline_args]) {|line| block } -> ios
|
915
|
-
# - ios.each_line(...) -> an_enumerator
|
885
|
+
# - each_line(sep = $/, chomp: false) {|line| ... } -> self
|
886
|
+
# - each_line(limit, chomp: false) {|line| ... } -> self
|
887
|
+
# - each_line(sep, limit, chomp: false) {|line| ... } -> self
|
888
|
+
# - each_line -> enumerator
|
916
889
|
# -->
|
917
|
-
#
|
918
|
-
#
|
890
|
+
# Calls the block with each remaining line read from the stream; returns `self`.
|
891
|
+
# Does nothing if already at end-of-stream; See [Line IO](rdoc-ref:IO@Line+IO).
|
919
892
|
#
|
920
|
-
#
|
893
|
+
# With no arguments given, reads lines as determined by line separator `$/`:
|
921
894
|
#
|
922
|
-
# f = File.new(
|
923
|
-
# f.
|
895
|
+
# f = File.new('t.txt')
|
896
|
+
# f.each_line {|line| p line }
|
897
|
+
# f.each_line {|line| fail 'Cannot happen' }
|
898
|
+
# f.close
|
924
899
|
#
|
925
|
-
#
|
900
|
+
# Output:
|
901
|
+
#
|
902
|
+
# "First line\n"
|
903
|
+
# "Second line\n"
|
904
|
+
# "\n"
|
905
|
+
# "Fourth line\n"
|
906
|
+
# "Fifth line\n"
|
907
|
+
#
|
908
|
+
# With only string argument `sep` given, reads lines as determined by line
|
909
|
+
# separator `sep`; see [Line Separator](rdoc-ref:IO@Line+Separator):
|
926
910
|
#
|
927
|
-
#
|
928
|
-
#
|
929
|
-
#
|
930
|
-
#
|
911
|
+
# f = File.new('t.txt')
|
912
|
+
# f.each_line('li') {|line| p line }
|
913
|
+
# f.close
|
914
|
+
#
|
915
|
+
# Output:
|
916
|
+
#
|
917
|
+
# "First li"
|
918
|
+
# "ne\nSecond li"
|
919
|
+
# "ne\n\nFourth li"
|
920
|
+
# "ne\nFifth li"
|
921
|
+
# "ne\n"
|
922
|
+
#
|
923
|
+
# The two special values for `sep` are honored:
|
924
|
+
#
|
925
|
+
# f = File.new('t.txt')
|
926
|
+
# # Get all into one string.
|
927
|
+
# f.each_line(nil) {|line| p line }
|
928
|
+
# f.close
|
929
|
+
#
|
930
|
+
# Output:
|
931
931
|
#
|
932
|
-
#
|
932
|
+
# "First line\nSecond line\n\nFourth line\nFifth line\n"
|
933
|
+
#
|
934
|
+
# f.rewind
|
935
|
+
# # Get paragraphs (up to two line separators).
|
936
|
+
# f.each_line('') {|line| p line }
|
937
|
+
#
|
938
|
+
# Output:
|
939
|
+
#
|
940
|
+
# "First line\nSecond line\n\n"
|
941
|
+
# "Fourth line\nFifth line\n"
|
942
|
+
#
|
943
|
+
# With only integer argument `limit` given, limits the number of bytes in each
|
944
|
+
# line; see [Line Limit](rdoc-ref:IO@Line+Limit):
|
945
|
+
#
|
946
|
+
# f = File.new('t.txt')
|
947
|
+
# f.each_line(8) {|line| p line }
|
948
|
+
# f.close
|
949
|
+
#
|
950
|
+
# Output:
|
951
|
+
#
|
952
|
+
# "First li"
|
953
|
+
# "ne\n"
|
954
|
+
# "Second l"
|
955
|
+
# "ine\n"
|
956
|
+
# "\n"
|
957
|
+
# "Fourth l"
|
958
|
+
# "ine\n"
|
959
|
+
# "Fifth li"
|
960
|
+
# "ne\n"
|
961
|
+
#
|
962
|
+
# With arguments `sep` and `limit` given, combines the two behaviors:
|
963
|
+
#
|
964
|
+
# * Calls with the next line as determined by line separator `sep`.
|
965
|
+
# * But returns no more bytes than are allowed by the limit.
|
966
|
+
#
|
967
|
+
#
|
968
|
+
# Optional keyword argument `chomp` specifies whether line separators are to be
|
969
|
+
# omitted:
|
970
|
+
#
|
971
|
+
# f = File.new('t.txt')
|
972
|
+
# f.each_line(chomp: true) {|line| p line }
|
973
|
+
# f.close
|
974
|
+
#
|
975
|
+
# Output:
|
976
|
+
#
|
977
|
+
# "First line"
|
978
|
+
# "Second line"
|
979
|
+
# ""
|
980
|
+
# "Fourth line"
|
981
|
+
# "Fifth line"
|
982
|
+
#
|
983
|
+
# Returns an Enumerator if no block is given.
|
984
|
+
#
|
985
|
+
# IO#each is an alias for IO#each_line.
|
933
986
|
#
|
934
987
|
def each: (?String sep, ?Integer limit) { (String arg0) -> untyped } -> self
|
935
988
|
| (?String sep, ?Integer limit) -> ::Enumerator[String, self]
|
936
989
|
|
937
990
|
# <!--
|
938
991
|
# rdoc-file=io.c
|
939
|
-
# -
|
940
|
-
# -
|
992
|
+
# - each_byte {|byte| ... } -> self
|
993
|
+
# - each_byte -> enumerator
|
941
994
|
# -->
|
942
|
-
# Calls the given block
|
943
|
-
#
|
944
|
-
# raised.
|
995
|
+
# Calls the given block with each byte (0..255) in the stream; returns `self`.
|
996
|
+
# See [Byte IO](rdoc-ref:IO@Byte+IO).
|
945
997
|
#
|
946
|
-
#
|
998
|
+
# f = File.new('t.rus')
|
999
|
+
# a = []
|
1000
|
+
# f.each_byte {|b| a << b }
|
1001
|
+
# a # => [209, 130, 208, 181, 209, 129, 209, 130]
|
1002
|
+
# f.close
|
947
1003
|
#
|
948
|
-
#
|
949
|
-
#
|
950
|
-
#
|
951
|
-
# checksum #=> 12
|
1004
|
+
# Returns an Enumerator if no block is given.
|
1005
|
+
#
|
1006
|
+
# Related: IO#each_char, IO#each_codepoint.
|
952
1007
|
#
|
953
1008
|
def each_byte: () { (Integer arg0) -> untyped } -> self
|
954
1009
|
| () -> ::Enumerator[Integer, self]
|
955
1010
|
|
956
1011
|
# <!--
|
957
1012
|
# rdoc-file=io.c
|
958
|
-
# -
|
959
|
-
# -
|
1013
|
+
# - each_char {|c| ... } -> self
|
1014
|
+
# - each_char -> enumerator
|
960
1015
|
# -->
|
961
|
-
# Calls the given block
|
962
|
-
#
|
963
|
-
# raised.
|
1016
|
+
# Calls the given block with each character in the stream; returns `self`. See
|
1017
|
+
# [Character IO](rdoc-ref:IO@Character+IO).
|
964
1018
|
#
|
965
|
-
#
|
1019
|
+
# f = File.new('t.rus')
|
1020
|
+
# a = []
|
1021
|
+
# f.each_char {|c| a << c.ord }
|
1022
|
+
# a # => [1090, 1077, 1089, 1090]
|
1023
|
+
# f.close
|
966
1024
|
#
|
967
|
-
#
|
968
|
-
#
|
1025
|
+
# Returns an Enumerator if no block is given.
|
1026
|
+
#
|
1027
|
+
# Related: IO#each_byte, IO#each_codepoint.
|
969
1028
|
#
|
970
1029
|
def each_char: () { (String arg0) -> untyped } -> self
|
971
1030
|
| () -> ::Enumerator[String, self]
|
972
1031
|
|
973
1032
|
# <!--
|
974
1033
|
# rdoc-file=io.c
|
975
|
-
# -
|
976
|
-
# -
|
1034
|
+
# - each_codepoint {|c| ... } -> self
|
1035
|
+
# - each_codepoint -> enumerator
|
977
1036
|
# -->
|
978
|
-
#
|
979
|
-
#
|
980
|
-
#
|
1037
|
+
# Calls the given block with each codepoint in the stream; returns `self`:
|
1038
|
+
#
|
1039
|
+
# f = File.new('t.rus')
|
1040
|
+
# a = []
|
1041
|
+
# f.each_codepoint {|c| a << c }
|
1042
|
+
# a # => [1090, 1077, 1089, 1090]
|
1043
|
+
# f.close
|
981
1044
|
#
|
982
|
-
#
|
1045
|
+
# Returns an Enumerator if no block is given.
|
1046
|
+
#
|
1047
|
+
# Related: IO#each_byte, IO#each_char.
|
983
1048
|
#
|
984
1049
|
def each_codepoint: () { (Integer arg0) -> untyped } -> self
|
985
1050
|
| () -> ::Enumerator[Integer, self]
|
@@ -989,15 +1054,16 @@ class IO < Object
|
|
989
1054
|
# - eof -> true or false
|
990
1055
|
# -->
|
991
1056
|
# Returns `true` if the stream is positioned at its end, `false` otherwise; see
|
992
|
-
# [Position](
|
1057
|
+
# [Position](rdoc-ref:IO@Position):
|
993
1058
|
#
|
994
1059
|
# f = File.open('t.txt')
|
995
1060
|
# f.eof # => false
|
996
1061
|
# f.seek(0, :END) # => 0
|
997
1062
|
# f.eof # => true
|
1063
|
+
# f.close
|
998
1064
|
#
|
999
1065
|
# Raises an exception unless the stream is opened for reading; see
|
1000
|
-
# [Mode](
|
1066
|
+
# [Mode](rdoc-ref:File@Access+Modes).
|
1001
1067
|
#
|
1002
1068
|
# If `self` is a stream such as pipe or socket, this method blocks until the
|
1003
1069
|
# other end sends some data or closes it:
|
@@ -1017,20 +1083,23 @@ class IO < Object
|
|
1017
1083
|
# not behave as you intend with IO#eof?, unless you call IO#rewind first (which
|
1018
1084
|
# is not available for some streams).
|
1019
1085
|
#
|
1020
|
-
#
|
1086
|
+
# IO#eof? is an alias for IO#eof.
|
1021
1087
|
#
|
1022
1088
|
def eof: () -> bool
|
1023
1089
|
|
1024
1090
|
# <!--
|
1025
1091
|
# rdoc-file=io.c
|
1026
|
-
# -
|
1092
|
+
# - fcntl(integer_cmd, argument) -> integer
|
1027
1093
|
# -->
|
1028
|
-
#
|
1029
|
-
#
|
1030
|
-
#
|
1031
|
-
#
|
1032
|
-
#
|
1033
|
-
#
|
1094
|
+
# Invokes Posix system call [fcntl(2)](https://linux.die.net/man/2/fcntl), which
|
1095
|
+
# provides a mechanism for issuing low-level commands to control or query a
|
1096
|
+
# file-oriented I/O stream. Arguments and results are platform dependent.
|
1097
|
+
#
|
1098
|
+
# If +argument is a number, its value is passed directly; if it is a string, it
|
1099
|
+
# is interpreted as a binary sequence of bytes. (Array#pack might be a useful
|
1100
|
+
# way to build this string.)
|
1101
|
+
#
|
1102
|
+
# Not implemented on all platforms.
|
1034
1103
|
#
|
1035
1104
|
def fcntl: (Integer integer_cmd, String | Integer arg) -> Integer
|
1036
1105
|
|
@@ -1054,6 +1123,7 @@ class IO < Object
|
|
1054
1123
|
# $stdout.fileno # => 1
|
1055
1124
|
# $stderr.fileno # => 2
|
1056
1125
|
# File.open('t.txt').fileno # => 10
|
1126
|
+
# f.close
|
1057
1127
|
#
|
1058
1128
|
# IO#to_i is an alias for IO#fileno.
|
1059
1129
|
#
|
@@ -1093,256 +1163,153 @@ class IO < Object
|
|
1093
1163
|
|
1094
1164
|
# <!--
|
1095
1165
|
# rdoc-file=io.c
|
1096
|
-
# -
|
1166
|
+
# - getbyte -> integer or nil
|
1097
1167
|
# -->
|
1098
|
-
#
|
1099
|
-
# of
|
1168
|
+
# Reads and returns the next byte (in range 0..255) from the stream; returns
|
1169
|
+
# `nil` if already at end-of-stream. See [Byte IO](rdoc-ref:IO@Byte+IO).
|
1100
1170
|
#
|
1101
|
-
# f = File.
|
1102
|
-
# f.getbyte
|
1103
|
-
# f.
|
1171
|
+
# f = File.open('t.txt')
|
1172
|
+
# f.getbyte # => 70
|
1173
|
+
# f.close
|
1174
|
+
# f = File.open('t.rus')
|
1175
|
+
# f.getbyte # => 209
|
1176
|
+
# f.close
|
1177
|
+
#
|
1178
|
+
# Related: IO#readbyte (may raise EOFError).
|
1104
1179
|
#
|
1105
1180
|
def getbyte: () -> Integer?
|
1106
1181
|
|
1107
1182
|
# <!--
|
1108
1183
|
# rdoc-file=io.c
|
1109
|
-
# -
|
1184
|
+
# - getc -> character or nil
|
1110
1185
|
# -->
|
1111
|
-
# Reads
|
1112
|
-
#
|
1186
|
+
# Reads and returns the next 1-character string from the stream; returns `nil`
|
1187
|
+
# if already at end-of-stream. See [Character IO](rdoc-ref:IO@Character+IO).
|
1113
1188
|
#
|
1114
|
-
# f = File.
|
1115
|
-
# f.getc
|
1116
|
-
# f.
|
1189
|
+
# f = File.open('t.txt')
|
1190
|
+
# f.getc # => "F"
|
1191
|
+
# f.close
|
1192
|
+
# f = File.open('t.rus')
|
1193
|
+
# f.getc.ord # => 1090
|
1194
|
+
# f.close
|
1195
|
+
#
|
1196
|
+
# Related: IO#readchar (may raise EOFError).
|
1117
1197
|
#
|
1118
1198
|
def getc: () -> String?
|
1119
1199
|
|
1120
1200
|
# <!--
|
1121
1201
|
# rdoc-file=io.c
|
1122
|
-
# - gets(sep = $/,
|
1123
|
-
# - gets(limit,
|
1124
|
-
# - gets(sep, limit,
|
1202
|
+
# - gets(sep = $/, chomp: false) -> string or nil
|
1203
|
+
# - gets(limit, chomp: false) -> string or nil
|
1204
|
+
# - gets(sep, limit, chomp: false) -> string or nil
|
1125
1205
|
# -->
|
1126
|
-
# Reads and returns
|
1206
|
+
# Reads and returns a line from the stream; assigns the return value to `$_`.
|
1207
|
+
# See [Line IO](rdoc-ref:IO@Line+IO).
|
1127
1208
|
#
|
1128
1209
|
# With no arguments given, returns the next line as determined by line separator
|
1129
1210
|
# `$/`, or `nil` if none:
|
1130
1211
|
#
|
1131
1212
|
# f = File.open('t.txt')
|
1132
|
-
# f.gets # => "
|
1133
|
-
# $_ # => "
|
1134
|
-
# f.gets # => "
|
1135
|
-
# f.gets # => "
|
1213
|
+
# f.gets # => "First line\n"
|
1214
|
+
# $_ # => "First line\n"
|
1215
|
+
# f.gets # => "\n"
|
1216
|
+
# f.gets # => "Fourth line\n"
|
1217
|
+
# f.gets # => "Fifth line\n"
|
1136
1218
|
# f.gets # => nil
|
1219
|
+
# f.close
|
1137
1220
|
#
|
1138
|
-
# With string argument `sep` given,
|
1139
|
-
# line
|
1140
|
-
#
|
1141
|
-
# f = File.open('t.txt')
|
1142
|
-
# f.gets(' is') # => "This is"
|
1143
|
-
# f.gets(' is') # => " line one.\nThis is"
|
1144
|
-
# f.gets(' is') # => " the second line.\nThis is"
|
1145
|
-
# f.gets(' is') # => " the third line.\n"
|
1146
|
-
# f.gets(' is') # => nil
|
1221
|
+
# With only string argument `sep` given, returns the next line as determined by
|
1222
|
+
# line separator `sep`, or `nil` if none; see [Line
|
1223
|
+
# Separator](rdoc-ref:IO@Line+Separator):
|
1147
1224
|
#
|
1148
|
-
#
|
1225
|
+
# f = File.new('t.txt')
|
1226
|
+
# f.gets('l') # => "First l"
|
1227
|
+
# f.gets('li') # => "ine\nSecond li"
|
1228
|
+
# f.gets('lin') # => "ne\n\nFourth lin"
|
1229
|
+
# f.gets # => "e\n"
|
1230
|
+
# f.close
|
1149
1231
|
#
|
1150
|
-
#
|
1151
|
-
# * `''` (empty string): The next "paragraph" is read and returned, the
|
1152
|
-
# paragraph separator being two successive line separators.
|
1232
|
+
# The two special values for `sep` are honored:
|
1153
1233
|
#
|
1234
|
+
# f = File.new('t.txt')
|
1235
|
+
# # Get all.
|
1236
|
+
# f.gets(nil) # => "First line\nSecond line\n\nFourth line\nFifth line\n"
|
1237
|
+
# f.rewind
|
1238
|
+
# # Get paragraph (up to two line separators).
|
1239
|
+
# f.gets('') # => "First line\nSecond line\n\n"
|
1240
|
+
# f.close
|
1154
1241
|
#
|
1155
|
-
# With integer argument `limit` given,
|
1242
|
+
# With only integer argument `limit` given, limits the number of bytes in the
|
1243
|
+
# line; see [Line Limit](rdoc-ref:IO@Line+Limit):
|
1156
1244
|
#
|
1157
|
-
# # Text with 1-byte characters.
|
1158
|
-
# File.open('t.txt') {|f| f.gets(1) } # => "T"
|
1159
|
-
# File.open('t.txt') {|f| f.gets(2) } # => "Th"
|
1160
|
-
# File.open('t.txt') {|f| f.gets(3) } # => "Thi"
|
1161
|
-
# File.open('t.txt') {|f| f.gets(4) } # => "This"
|
1162
1245
|
# # No more than one line.
|
1163
|
-
# File.open('t.txt') {|f| f.gets(
|
1164
|
-
# File.open('t.txt') {|f| f.gets(
|
1165
|
-
# File.open('t.txt') {|f| f.gets(
|
1166
|
-
#
|
1167
|
-
# # Text with 2-byte characters, which will not be split.
|
1168
|
-
# File.open('t.rus') {|f| f.gets(1).size } # => 1
|
1169
|
-
# File.open('t.rus') {|f| f.gets(2).size } # => 1
|
1170
|
-
# File.open('t.rus') {|f| f.gets(3).size } # => 2
|
1171
|
-
# File.open('t.rus') {|f| f.gets(4).size } # => 2
|
1246
|
+
# File.open('t.txt') {|f| f.gets(10) } # => "First line"
|
1247
|
+
# File.open('t.txt') {|f| f.gets(11) } # => "First line\n"
|
1248
|
+
# File.open('t.txt') {|f| f.gets(12) } # => "First line\n"
|
1172
1249
|
#
|
1173
|
-
# With arguments `sep` and `limit
|
1250
|
+
# With arguments `sep` and `limit` given, combines the two behaviors:
|
1174
1251
|
#
|
1175
1252
|
# * Returns the next line as determined by line separator `sep`, or `nil` if
|
1176
1253
|
# none.
|
1177
|
-
# * But returns no more than
|
1254
|
+
# * But returns no more bytes than are allowed by the limit.
|
1178
1255
|
#
|
1179
1256
|
#
|
1180
|
-
#
|
1181
|
-
#
|
1257
|
+
# Optional keyword argument `chomp` specifies whether line separators are to be
|
1258
|
+
# omitted:
|
1182
1259
|
#
|
1183
1260
|
# f = File.open('t.txt')
|
1184
1261
|
# # Chomp the lines.
|
1185
|
-
# f.gets(chomp: true) # => "
|
1186
|
-
# f.gets(chomp: true) # => "
|
1187
|
-
# f.gets(chomp: true) # => "
|
1262
|
+
# f.gets(chomp: true) # => "First line"
|
1263
|
+
# f.gets(chomp: true) # => "Second line"
|
1264
|
+
# f.gets(chomp: true) # => ""
|
1265
|
+
# f.gets(chomp: true) # => "Fourth line"
|
1266
|
+
# f.gets(chomp: true) # => "Fifth line"
|
1188
1267
|
# f.gets(chomp: true) # => nil
|
1268
|
+
# f.close
|
1189
1269
|
#
|
1190
1270
|
def gets: (?String sep, ?Integer limit) -> String?
|
1191
1271
|
|
1192
1272
|
# <!--
|
1193
1273
|
# rdoc-file=io.c
|
1194
|
-
# - IO.new(fd
|
1274
|
+
# - IO.new(fd, mode = 'r', **opts) -> io
|
1195
1275
|
# -->
|
1196
|
-
#
|
1197
|
-
# and `mode` string. `opt` may be used to specify parts of `mode` in a more
|
1198
|
-
# readable fashion. See also IO.sysopen and IO.for_fd.
|
1199
|
-
#
|
1200
|
-
# IO.new is called by various File and IO opening methods such as IO::open,
|
1201
|
-
# Kernel#open, and File::open.
|
1202
|
-
#
|
1203
|
-
# ### Open Mode
|
1204
|
-
#
|
1205
|
-
# When `mode` is an integer it must be combination of the modes defined in
|
1206
|
-
# File::Constants (`File::RDONLY`, `File::WRONLY|File::CREAT`). See the open(2)
|
1207
|
-
# man page for more information.
|
1208
|
-
#
|
1209
|
-
# When `mode` is a string it must be in one of the following forms:
|
1210
|
-
#
|
1211
|
-
# fmode
|
1212
|
-
# fmode ":" ext_enc
|
1213
|
-
# fmode ":" ext_enc ":" int_enc
|
1214
|
-
# fmode ":" "BOM|UTF-*"
|
1215
|
-
#
|
1216
|
-
# `fmode` is an IO open mode string, `ext_enc` is the external encoding for the
|
1217
|
-
# IO and `int_enc` is the internal encoding.
|
1218
|
-
#
|
1219
|
-
# #### IO Open Mode
|
1220
|
-
#
|
1221
|
-
# Ruby allows the following open modes:
|
1222
|
-
#
|
1223
|
-
# "r" Read-only, starts at beginning of file (default mode).
|
1224
|
-
#
|
1225
|
-
# "r+" Read-write, starts at beginning of file.
|
1226
|
-
#
|
1227
|
-
# "w" Write-only, truncates existing file
|
1228
|
-
# to zero length or creates a new file for writing.
|
1229
|
-
#
|
1230
|
-
# "w+" Read-write, truncates existing file to zero length
|
1231
|
-
# or creates a new file for reading and writing.
|
1232
|
-
#
|
1233
|
-
# "a" Write-only, each write call appends data at end of file.
|
1234
|
-
# Creates a new file for writing if file does not exist.
|
1235
|
-
#
|
1236
|
-
# "a+" Read-write, each write call appends data at end of file.
|
1237
|
-
# Creates a new file for reading and writing if file does
|
1238
|
-
# not exist.
|
1239
|
-
#
|
1240
|
-
# The following modes must be used separately, and along with one or more of the
|
1241
|
-
# modes seen above.
|
1242
|
-
#
|
1243
|
-
# "b" Binary file mode
|
1244
|
-
# Suppresses EOL <-> CRLF conversion on Windows. And
|
1245
|
-
# sets external encoding to ASCII-8BIT unless explicitly
|
1246
|
-
# specified.
|
1247
|
-
#
|
1248
|
-
# "t" Text file mode
|
1276
|
+
# Creates and returns a new IO object (file stream) from a file descriptor.
|
1249
1277
|
#
|
1250
|
-
#
|
1251
|
-
#
|
1252
|
-
#
|
1278
|
+
# IO.new may be useful for interaction with low-level libraries. For
|
1279
|
+
# higher-level interactions, it may be simpler to create the file stream using
|
1280
|
+
# File.open.
|
1253
1281
|
#
|
1254
|
-
#
|
1255
|
-
# be writable. Similarly, the open mode cannot be changed from write only to
|
1256
|
-
# readable.
|
1282
|
+
# Argument `fd` must be a valid file descriptor (integer):
|
1257
1283
|
#
|
1258
|
-
#
|
1259
|
-
#
|
1284
|
+
# path = 't.tmp'
|
1285
|
+
# fd = IO.sysopen(path) # => 3
|
1286
|
+
# IO.new(fd) # => #<IO:fd 3>
|
1260
1287
|
#
|
1261
|
-
#
|
1288
|
+
# The new IO object does not inherit encoding (because the integer file
|
1289
|
+
# descriptor does not have an encoding):
|
1262
1290
|
#
|
1263
|
-
#
|
1264
|
-
#
|
1265
|
-
#
|
1291
|
+
# fd = IO.sysopen('t.rus', 'rb')
|
1292
|
+
# io = IO.new(fd)
|
1293
|
+
# io.external_encoding # => #<Encoding:UTF-8> # Not ASCII-8BIT.
|
1266
1294
|
#
|
1267
|
-
#
|
1268
|
-
#
|
1269
|
-
# `int_enc` to `ext_enc` upon output. See Encoding for further details of
|
1270
|
-
# transcoding on input and output.
|
1295
|
+
# Optional argument `mode` (defaults to 'r') must specify a valid mode; see
|
1296
|
+
# [Access Modes](rdoc-ref:File@Access+Modes):
|
1271
1297
|
#
|
1272
|
-
#
|
1273
|
-
#
|
1274
|
-
# encodings the file open mode must be binary. When present, the BOM is
|
1275
|
-
# stripped and the external encoding from the BOM is used. When the BOM is
|
1276
|
-
# missing the given Unicode encoding is used as `ext_enc`. (The BOM-set
|
1277
|
-
# encoding option is case insensitive, so "bom|utf-8" is also valid.)
|
1298
|
+
# IO.new(fd, 'w') # => #<IO:fd 3>
|
1299
|
+
# IO.new(fd, File::WRONLY) # => #<IO:fd 3>
|
1278
1300
|
#
|
1279
|
-
#
|
1301
|
+
# Optional keyword arguments `opts` specify:
|
1280
1302
|
#
|
1281
|
-
#
|
1282
|
-
#
|
1303
|
+
# * [Open Options](rdoc-ref:IO@Open+Options).
|
1304
|
+
# * [Encoding options](rdoc-ref:encodings.rdoc@Encoding+Options).
|
1283
1305
|
#
|
1284
|
-
# :mode
|
1285
|
-
# : Same as `mode` parameter
|
1286
1306
|
#
|
1287
|
-
# :
|
1288
|
-
# : Specifies file open flags as integer. If `mode` parameter is given, this
|
1289
|
-
# parameter will be bitwise-ORed.
|
1290
|
-
#
|
1291
|
-
# :external_encoding
|
1292
|
-
# : External encoding for the IO.
|
1293
|
-
#
|
1294
|
-
# :internal_encoding
|
1295
|
-
# : Internal encoding for the IO. "-" is a synonym for the default internal
|
1296
|
-
# encoding.
|
1297
|
-
#
|
1298
|
-
# If the value is `nil` no conversion occurs.
|
1299
|
-
#
|
1300
|
-
# :encoding
|
1301
|
-
# : Specifies external and internal encodings as "extern:intern".
|
1302
|
-
#
|
1303
|
-
# :textmode
|
1304
|
-
# : If the value is truth value, same as "t" in argument `mode`.
|
1305
|
-
#
|
1306
|
-
# :binmode
|
1307
|
-
# : If the value is truth value, same as "b" in argument `mode`.
|
1308
|
-
#
|
1309
|
-
# :autoclose
|
1310
|
-
# : If the value is `false`, the `fd` will be kept open after this IO instance
|
1311
|
-
# gets finalized.
|
1312
|
-
#
|
1313
|
-
#
|
1314
|
-
# Also, `opt` can have same keys in String#encode for controlling conversion
|
1315
|
-
# between the external encoding and the internal encoding.
|
1316
|
-
#
|
1317
|
-
# ### Example 1
|
1318
|
-
#
|
1319
|
-
# fd = IO.sysopen("/dev/tty", "w")
|
1320
|
-
# a = IO.new(fd,"w")
|
1321
|
-
# $stderr.puts "Hello"
|
1322
|
-
# a.puts "World"
|
1323
|
-
#
|
1324
|
-
# Produces:
|
1325
|
-
#
|
1326
|
-
# Hello
|
1327
|
-
# World
|
1328
|
-
#
|
1329
|
-
# ### Example 2
|
1330
|
-
#
|
1331
|
-
# require 'fcntl'
|
1332
|
-
#
|
1333
|
-
# fd = STDERR.fcntl(Fcntl::F_DUPFD)
|
1334
|
-
# io = IO.new(fd, mode: 'w:UTF-16LE', cr_newline: true)
|
1335
|
-
# io.puts "Hello, World!"
|
1336
|
-
#
|
1337
|
-
# fd = STDERR.fcntl(Fcntl::F_DUPFD)
|
1338
|
-
# io = IO.new(fd, mode: 'w', cr_newline: true,
|
1339
|
-
# external_encoding: Encoding::UTF_16LE)
|
1340
|
-
# io.puts "Hello, World!"
|
1307
|
+
# Examples:
|
1341
1308
|
#
|
1342
|
-
#
|
1343
|
-
#
|
1309
|
+
# IO.new(fd, internal_encoding: nil) # => #<IO:fd 3>
|
1310
|
+
# IO.new(fd, autoclose: true) # => #<IO:fd 3>
|
1344
1311
|
#
|
1345
|
-
def initialize: (
|
1312
|
+
def initialize: (int fd, ?string | int mode, ?path: string?, **untyped opts) -> void
|
1346
1313
|
|
1347
1314
|
# <!--
|
1348
1315
|
# rdoc-file=io.c
|
@@ -1352,84 +1319,86 @@ class IO < Object
|
|
1352
1319
|
#
|
1353
1320
|
# f = File.open('t.txt')
|
1354
1321
|
# f.inspect # => "#<File:t.txt>"
|
1322
|
+
# f.close
|
1355
1323
|
#
|
1356
1324
|
def inspect: () -> String
|
1357
1325
|
|
1358
1326
|
# <!--
|
1359
1327
|
# rdoc-file=io.c
|
1360
|
-
# -
|
1328
|
+
# - internal_encoding -> encoding or nil
|
1361
1329
|
# -->
|
1362
|
-
# Returns the Encoding
|
1363
|
-
#
|
1330
|
+
# Returns the Encoding object that represents the encoding of the internal
|
1331
|
+
# string, if conversion is specified, or `nil` otherwise.
|
1332
|
+
#
|
1333
|
+
# See [Encodings](rdoc-ref:File@Encodings).
|
1364
1334
|
#
|
1365
1335
|
def internal_encoding: () -> Encoding
|
1366
1336
|
|
1367
1337
|
# <!--
|
1368
1338
|
# rdoc-file=io.c
|
1369
|
-
# -
|
1339
|
+
# - ioctl(integer_cmd, argument) -> integer
|
1370
1340
|
# -->
|
1371
|
-
#
|
1372
|
-
#
|
1373
|
-
#
|
1374
|
-
#
|
1375
|
-
#
|
1341
|
+
# Invokes Posix system call [ioctl(2)](https://linux.die.net/man/2/ioctl), which
|
1342
|
+
# issues a low-level command to an I/O device.
|
1343
|
+
#
|
1344
|
+
# Issues a low-level command to an I/O device. The arguments and returned value
|
1345
|
+
# are platform-dependent. The effect of the call is platform-dependent.
|
1346
|
+
#
|
1347
|
+
# If argument `argument` is an integer, it is passed directly; if it is a
|
1348
|
+
# string, it is interpreted as a binary sequence of bytes.
|
1349
|
+
#
|
1350
|
+
# Not implemented on all platforms.
|
1376
1351
|
#
|
1377
1352
|
def ioctl: (Integer integer_cmd, String | Integer arg) -> Integer
|
1378
1353
|
|
1379
1354
|
# <!--
|
1380
1355
|
# rdoc-file=io.c
|
1381
|
-
# -
|
1382
|
-
# - ios.tty? -> true or false
|
1356
|
+
# - isatty -> true or false
|
1383
1357
|
# -->
|
1384
|
-
# Returns `true` if
|
1385
|
-
# otherwise
|
1358
|
+
# Returns `true` if the stream is associated with a terminal device (tty),
|
1359
|
+
# `false` otherwise:
|
1360
|
+
#
|
1361
|
+
# f = File.new('t.txt').isatty #=> false
|
1362
|
+
# f.close
|
1363
|
+
# f = File.new('/dev/tty').isatty #=> true
|
1364
|
+
# f.close
|
1386
1365
|
#
|
1387
|
-
#
|
1388
|
-
# File.new("/dev/tty").isatty #=> true
|
1366
|
+
# IO#tty? is an alias for IO#isatty.
|
1389
1367
|
#
|
1390
1368
|
def isatty: () -> bool
|
1391
1369
|
|
1392
1370
|
# <!--
|
1393
1371
|
# rdoc-file=io.c
|
1394
|
-
# -
|
1372
|
+
# - lineno -> integer
|
1395
1373
|
# -->
|
1396
|
-
# Returns the current line number
|
1397
|
-
#
|
1398
|
-
# number of newlines encountered. The two values will differ if #gets is called
|
1399
|
-
# with a separator other than newline.
|
1400
|
-
#
|
1401
|
-
# Methods that use `$/` like #each, #lines and #readline will also increment
|
1402
|
-
# #lineno.
|
1403
|
-
#
|
1404
|
-
# See also the `$.` variable.
|
1405
|
-
#
|
1406
|
-
# f = File.new("testfile")
|
1407
|
-
# f.lineno #=> 0
|
1408
|
-
# f.gets #=> "This is line one\n"
|
1409
|
-
# f.lineno #=> 1
|
1410
|
-
# f.gets #=> "This is line two\n"
|
1411
|
-
# f.lineno #=> 2
|
1374
|
+
# Returns the current line number for the stream; see [Line
|
1375
|
+
# Number](rdoc-ref:IO@Line+Number).
|
1412
1376
|
#
|
1413
1377
|
def lineno: () -> Integer
|
1414
1378
|
|
1415
1379
|
# <!--
|
1416
1380
|
# rdoc-file=io.c
|
1417
|
-
# -
|
1381
|
+
# - lineno = integer -> integer
|
1418
1382
|
# -->
|
1419
|
-
#
|
1420
|
-
#
|
1421
|
-
#
|
1422
|
-
# f = File.new("testfile")
|
1423
|
-
# f.gets #=> "This is line one\n"
|
1424
|
-
# $. #=> 1
|
1425
|
-
# f.lineno = 1000
|
1426
|
-
# f.lineno #=> 1000
|
1427
|
-
# $. #=> 1 # lineno of last read
|
1428
|
-
# f.gets #=> "This is line two\n"
|
1429
|
-
# $. #=> 1001 # lineno of last read
|
1383
|
+
# Sets and returns the line number for the stream; see [Line
|
1384
|
+
# Number](rdoc-ref:IO@Line+Number).
|
1430
1385
|
#
|
1431
1386
|
def lineno=: (Integer arg0) -> Integer
|
1432
1387
|
|
1388
|
+
# <!--
|
1389
|
+
# rdoc-file=io.c
|
1390
|
+
# - path -> string or nil
|
1391
|
+
# -->
|
1392
|
+
# Returns the path associated with the IO, or `nil` if there is no path
|
1393
|
+
# associated with the IO. It is not guaranteed that the path exists on the
|
1394
|
+
# filesystem.
|
1395
|
+
#
|
1396
|
+
# $stdin.path # => "<STDIN>"
|
1397
|
+
#
|
1398
|
+
# File.open("testfile") {|f| f.path} # => "testfile"
|
1399
|
+
#
|
1400
|
+
def path: () -> String?
|
1401
|
+
|
1433
1402
|
# <!--
|
1434
1403
|
# rdoc-file=io.c
|
1435
1404
|
# - pid -> integer or nil
|
@@ -1454,12 +1423,13 @@ class IO < Object
|
|
1454
1423
|
|
1455
1424
|
# <!-- rdoc-file=io.c -->
|
1456
1425
|
# Returns the current position (in bytes) in `self` (see
|
1457
|
-
# [Position](
|
1426
|
+
# [Position](rdoc-ref:IO@Position)):
|
1458
1427
|
#
|
1459
|
-
# f = File.
|
1460
|
-
# f.tell
|
1461
|
-
# f.
|
1462
|
-
# f.tell
|
1428
|
+
# f = File.open('t.txt')
|
1429
|
+
# f.tell # => 0
|
1430
|
+
# f.gets # => "First line\n"
|
1431
|
+
# f.tell # => 12
|
1432
|
+
# f.close
|
1463
1433
|
#
|
1464
1434
|
# Related: IO#pos=, IO#seek.
|
1465
1435
|
#
|
@@ -1472,12 +1442,13 @@ class IO < Object
|
|
1472
1442
|
# - pos = new_position -> new_position
|
1473
1443
|
# -->
|
1474
1444
|
# Seeks to the given `new_position` (in bytes); see
|
1475
|
-
# [Position](
|
1445
|
+
# [Position](rdoc-ref:IO@Position):
|
1476
1446
|
#
|
1477
1447
|
# f = File.open('t.txt')
|
1478
1448
|
# f.tell # => 0
|
1479
1449
|
# f.pos = 20 # => 20
|
1480
1450
|
# f.tell # => 20
|
1451
|
+
# f.close
|
1481
1452
|
#
|
1482
1453
|
# Related: IO#seek, IO#tell.
|
1483
1454
|
#
|
@@ -1485,48 +1456,86 @@ class IO < Object
|
|
1485
1456
|
|
1486
1457
|
# <!--
|
1487
1458
|
# rdoc-file=io.c
|
1488
|
-
# -
|
1489
|
-
# - ios.print(obj, ...) -> nil
|
1459
|
+
# - print(*objects) -> nil
|
1490
1460
|
# -->
|
1491
|
-
# Writes the given
|
1461
|
+
# Writes the given objects to the stream; returns `nil`. Appends the output
|
1462
|
+
# record separator `$OUTPUT_RECORD_SEPARATOR` (`$\`), if it is not `nil`. See
|
1463
|
+
# [Line IO](rdoc-ref:IO@Line+IO).
|
1492
1464
|
#
|
1493
|
-
#
|
1494
|
-
# will be converted by calling its `to_s` method. When called without arguments,
|
1495
|
-
# prints the contents of `$_`.
|
1465
|
+
# With argument `objects` given, for each object:
|
1496
1466
|
#
|
1497
|
-
#
|
1498
|
-
#
|
1499
|
-
# the output
|
1467
|
+
# * Converts via its method `to_s` if not a string.
|
1468
|
+
# * Writes to the stream.
|
1469
|
+
# * If not the last object, writes the output field separator
|
1470
|
+
# `$OUTPUT_FIELD_SEPARATOR` (`$,`) if it is not `nil`.
|
1500
1471
|
#
|
1501
|
-
# $stdout.print("This is ", 100, " percent.\n")
|
1502
1472
|
#
|
1503
|
-
#
|
1473
|
+
# With default separators:
|
1504
1474
|
#
|
1505
|
-
#
|
1475
|
+
# f = File.open('t.tmp', 'w+')
|
1476
|
+
# objects = [0, 0.0, Rational(0, 1), Complex(0, 0), :zero, 'zero']
|
1477
|
+
# p $OUTPUT_RECORD_SEPARATOR
|
1478
|
+
# p $OUTPUT_FIELD_SEPARATOR
|
1479
|
+
# f.print(*objects)
|
1480
|
+
# f.rewind
|
1481
|
+
# p f.read
|
1482
|
+
# f.close
|
1483
|
+
#
|
1484
|
+
# Output:
|
1485
|
+
#
|
1486
|
+
# nil
|
1487
|
+
# nil
|
1488
|
+
# "00.00/10+0izerozero"
|
1489
|
+
#
|
1490
|
+
# With specified separators:
|
1491
|
+
#
|
1492
|
+
# $\ = "\n"
|
1493
|
+
# $, = ','
|
1494
|
+
# f.rewind
|
1495
|
+
# f.print(*objects)
|
1496
|
+
# f.rewind
|
1497
|
+
# p f.read
|
1498
|
+
#
|
1499
|
+
# Output:
|
1500
|
+
#
|
1501
|
+
# "0,0.0,0/1,0+0i,zero,zero\n"
|
1502
|
+
#
|
1503
|
+
# With no argument given, writes the content of `$_` (which is usually the most
|
1504
|
+
# recent user input):
|
1505
|
+
#
|
1506
|
+
# f = File.open('t.tmp', 'w+')
|
1507
|
+
# gets # Sets $_ to the most recent user input.
|
1508
|
+
# f.print
|
1509
|
+
# f.close
|
1506
1510
|
#
|
1507
1511
|
def print: (*untyped arg0) -> NilClass
|
1508
1512
|
|
1509
1513
|
# <!--
|
1510
1514
|
# rdoc-file=io.c
|
1511
|
-
# -
|
1515
|
+
# - printf(format_string, *objects) -> nil
|
1512
1516
|
# -->
|
1513
|
-
# Formats and writes to
|
1514
|
-
#
|
1517
|
+
# Formats and writes `objects` to the stream.
|
1518
|
+
#
|
1519
|
+
# For details on `format_string`, see [Format
|
1520
|
+
# Specifications](rdoc-ref:format_specifications.rdoc).
|
1515
1521
|
#
|
1516
1522
|
def printf: (String format_string, *untyped arg0) -> NilClass
|
1517
1523
|
|
1518
1524
|
# <!--
|
1519
1525
|
# rdoc-file=io.c
|
1520
|
-
# -
|
1526
|
+
# - putc(object) -> object
|
1521
1527
|
# -->
|
1522
|
-
#
|
1523
|
-
#
|
1524
|
-
#
|
1528
|
+
# Writes a character to the stream. See [Character
|
1529
|
+
# IO](rdoc-ref:IO@Character+IO).
|
1530
|
+
#
|
1531
|
+
# If `object` is numeric, converts to integer if necessary, then writes the
|
1532
|
+
# character whose code is the least significant byte; if `object` is a string,
|
1533
|
+
# writes the first character:
|
1525
1534
|
#
|
1526
1535
|
# $stdout.putc "A"
|
1527
1536
|
# $stdout.putc 65
|
1528
1537
|
#
|
1529
|
-
#
|
1538
|
+
# Output:
|
1530
1539
|
#
|
1531
1540
|
# AA
|
1532
1541
|
#
|
@@ -1534,40 +1543,60 @@ class IO < Object
|
|
1534
1543
|
|
1535
1544
|
# <!--
|
1536
1545
|
# rdoc-file=io.c
|
1537
|
-
# -
|
1546
|
+
# - puts(*objects) -> nil
|
1538
1547
|
# -->
|
1539
|
-
# Writes the given
|
1540
|
-
#
|
1548
|
+
# Writes the given `objects` to the stream, which must be open for writing;
|
1549
|
+
# returns `nil`.\ Writes a newline after each that does not already end with a
|
1550
|
+
# newline sequence. If called without arguments, writes a newline. See [Line
|
1551
|
+
# IO](rdoc-ref:IO@Line+IO).
|
1541
1552
|
#
|
1542
|
-
#
|
1543
|
-
#
|
1544
|
-
# array will be converted by calling its `to_s` method. If called without
|
1545
|
-
# arguments, outputs a single newline.
|
1553
|
+
# Note that each added newline is the character `"\n"<//tt>, not the output
|
1554
|
+
# record separator (<tt>$\`).
|
1546
1555
|
#
|
1547
|
-
#
|
1556
|
+
# Treatment for each object:
|
1548
1557
|
#
|
1549
|
-
# *
|
1558
|
+
# * String: writes the string.
|
1559
|
+
# * Neither string nor array: writes `object.to_s`.
|
1560
|
+
# * Array: writes each element of the array; arrays may be nested.
|
1561
|
+
#
|
1562
|
+
#
|
1563
|
+
# To keep these examples brief, we define this helper method:
|
1564
|
+
#
|
1565
|
+
# def show(*objects)
|
1566
|
+
# # Puts objects to file.
|
1567
|
+
# f = File.new('t.tmp', 'w+')
|
1568
|
+
# f.puts(objects)
|
1569
|
+
# # Return file content.
|
1570
|
+
# f.rewind
|
1571
|
+
# p f.read
|
1572
|
+
# f.close
|
1573
|
+
# end
|
1550
1574
|
#
|
1551
|
-
#
|
1552
|
-
#
|
1553
|
-
#
|
1554
|
-
#
|
1575
|
+
# # Strings without newlines.
|
1576
|
+
# show('foo', 'bar', 'baz') # => "foo\nbar\nbaz\n"
|
1577
|
+
# # Strings, some with newlines.
|
1578
|
+
# show("foo\n", 'bar', "baz\n") # => "foo\nbar\nbaz\n"
|
1555
1579
|
#
|
1556
|
-
#
|
1557
|
-
#
|
1580
|
+
# # Neither strings nor arrays:
|
1581
|
+
# show(0, 0.0, Rational(0, 1), Complex(9, 0), :zero)
|
1582
|
+
# # => "0\n0.0\n0/1\n9+0i\nzero\n"
|
1583
|
+
#
|
1584
|
+
# # Array of strings.
|
1585
|
+
# show(['foo', "bar\n", 'baz']) # => "foo\nbar\nbaz\n"
|
1586
|
+
# # Nested arrays.
|
1587
|
+
# show([[[0, 1], 2, 3], 4, 5]) # => "0\n1\n2\n3\n4\n5\n"
|
1558
1588
|
#
|
1559
1589
|
def puts: (*untyped arg0) -> NilClass
|
1560
1590
|
|
1561
1591
|
# <!--
|
1562
1592
|
# rdoc-file=io.c
|
1563
|
-
# - read(maxlen = nil)
|
1564
|
-
# - read(maxlen = nil, out_string) -> out_string or nil
|
1593
|
+
# - read(maxlen = nil, out_string = nil) -> new_string, out_string, or nil
|
1565
1594
|
# -->
|
1566
|
-
# Reads bytes from the stream
|
1595
|
+
# Reads bytes from the stream; the stream must be opened for reading (see
|
1596
|
+
# [Access Modes](rdoc-ref:File@Access+Modes)):
|
1567
1597
|
#
|
1568
|
-
# * If `maxlen` is `nil`, reads all bytes.
|
1569
|
-
# * Otherwise reads `maxlen` bytes
|
1570
|
-
# * Otherwise reads all bytes.
|
1598
|
+
# * If `maxlen` is `nil`, reads all bytes using the stream's data mode.
|
1599
|
+
# * Otherwise reads up to `maxlen` bytes in binary mode.
|
1571
1600
|
#
|
1572
1601
|
#
|
1573
1602
|
# Returns a string (either a new string or the given `out_string`) containing
|
@@ -1589,11 +1618,12 @@ class IO < Object
|
|
1589
1618
|
#
|
1590
1619
|
# f = File.new('t.txt')
|
1591
1620
|
# f.read
|
1592
|
-
# # => "
|
1621
|
+
# # => "First line\nSecond line\n\nFourth line\nFifth line\n"
|
1593
1622
|
# f.rewind
|
1594
|
-
# f.read(
|
1595
|
-
# f.read(
|
1596
|
-
# f.read(
|
1623
|
+
# f.read(30) # => "First line\r\nSecond line\r\n\r\nFou"
|
1624
|
+
# f.read(30) # => "rth line\r\nFifth line\r\n"
|
1625
|
+
# f.read(30) # => nil
|
1626
|
+
# f.close
|
1597
1627
|
#
|
1598
1628
|
# If `maxlen` is zero, returns an empty string.
|
1599
1629
|
#
|
@@ -1604,18 +1634,19 @@ class IO < Object
|
|
1604
1634
|
#
|
1605
1635
|
# f = File.new('t.txt')
|
1606
1636
|
# s = 'foo' # => "foo"
|
1607
|
-
# f.read(nil, s) # => "
|
1608
|
-
# s # => "
|
1637
|
+
# f.read(nil, s) # => "First line\nSecond line\n\nFourth line\nFifth line\n"
|
1638
|
+
# s # => "First line\nSecond line\n\nFourth line\nFifth line\n"
|
1609
1639
|
# f.rewind
|
1610
1640
|
# s = 'bar'
|
1611
|
-
# f.read(
|
1612
|
-
# s # => "
|
1641
|
+
# f.read(30, s) # => "First line\r\nSecond line\r\n\r\nFou"
|
1642
|
+
# s # => "First line\r\nSecond line\r\n\r\nFou"
|
1613
1643
|
# s = 'baz'
|
1614
|
-
# f.read(
|
1615
|
-
# s # => "
|
1644
|
+
# f.read(30, s) # => "rth line\r\nFifth line\r\n"
|
1645
|
+
# s # => "rth line\r\nFifth line\r\n"
|
1616
1646
|
# s = 'bat'
|
1617
|
-
# f.read(
|
1647
|
+
# f.read(30, s) # => nil
|
1618
1648
|
# s # => ""
|
1649
|
+
# f.close
|
1619
1650
|
#
|
1620
1651
|
# Note that this method behaves like the fread() function in C. This means it
|
1621
1652
|
# retries to invoke read(2) system calls to read data with the specified maxlen
|
@@ -1627,6 +1658,8 @@ class IO < Object
|
|
1627
1658
|
# If you need the behavior like a single read(2) system call, consider
|
1628
1659
|
# #readpartial, #read_nonblock, and #sysread.
|
1629
1660
|
#
|
1661
|
+
# Related: IO#write.
|
1662
|
+
#
|
1630
1663
|
def read: (?int? length, ?string outbuf) -> String?
|
1631
1664
|
|
1632
1665
|
# <!--
|
@@ -1687,54 +1720,113 @@ class IO < Object
|
|
1687
1720
|
|
1688
1721
|
# <!--
|
1689
1722
|
# rdoc-file=io.c
|
1690
|
-
# -
|
1723
|
+
# - readbyte -> integer
|
1691
1724
|
# -->
|
1692
|
-
# Reads
|
1725
|
+
# Reads and returns the next byte (in range 0..255) from the stream; raises
|
1726
|
+
# EOFError if already at end-of-stream. See [Byte IO](rdoc-ref:IO@Byte+IO).
|
1727
|
+
#
|
1728
|
+
# f = File.open('t.txt')
|
1729
|
+
# f.readbyte # => 70
|
1730
|
+
# f.close
|
1731
|
+
# f = File.open('t.rus')
|
1732
|
+
# f.readbyte # => 209
|
1733
|
+
# f.close
|
1734
|
+
#
|
1735
|
+
# Related: IO#getbyte (will not raise EOFError).
|
1693
1736
|
#
|
1694
1737
|
def readbyte: () -> Integer
|
1695
1738
|
|
1696
1739
|
# <!--
|
1697
1740
|
# rdoc-file=io.c
|
1698
|
-
# -
|
1741
|
+
# - readchar -> string
|
1699
1742
|
# -->
|
1700
|
-
# Reads
|
1743
|
+
# Reads and returns the next 1-character string from the stream; raises EOFError
|
1744
|
+
# if already at end-of-stream. See [Character IO](rdoc-ref:IO@Character+IO).
|
1701
1745
|
#
|
1702
|
-
# f = File.
|
1703
|
-
# f.readchar
|
1704
|
-
# f.
|
1746
|
+
# f = File.open('t.txt')
|
1747
|
+
# f.readchar # => "F"
|
1748
|
+
# f.close
|
1749
|
+
# f = File.open('t.rus')
|
1750
|
+
# f.readchar.ord # => 1090
|
1751
|
+
# f.close
|
1752
|
+
#
|
1753
|
+
# Related: IO#getc (will not raise EOFError).
|
1705
1754
|
#
|
1706
1755
|
def readchar: () -> String
|
1707
1756
|
|
1708
1757
|
# <!--
|
1709
1758
|
# rdoc-file=io.c
|
1710
|
-
# -
|
1711
|
-
# -
|
1712
|
-
# -
|
1759
|
+
# - readline(sep = $/, chomp: false) -> string
|
1760
|
+
# - readline(limit, chomp: false) -> string
|
1761
|
+
# - readline(sep, limit, chomp: false) -> string
|
1762
|
+
# -->
|
1763
|
+
# Reads a line as with IO#gets, but raises EOFError if already at end-of-stream.
|
1764
|
+
#
|
1765
|
+
# Optional keyword argument `chomp` specifies whether line separators are to be
|
1766
|
+
# omitted.
|
1767
|
+
#
|
1768
|
+
def readline: (?String sep, ?Integer limit) -> String
|
1769
|
+
|
1770
|
+
# <!--
|
1771
|
+
# rdoc-file=io.c
|
1772
|
+
# - readlines(sep = $/, chomp: false) -> array
|
1773
|
+
# - readlines(limit, chomp: false) -> array
|
1774
|
+
# - readlines(sep, limit, chomp: false) -> array
|
1713
1775
|
# -->
|
1714
|
-
# Reads
|
1776
|
+
# Reads and returns all remaining line from the stream; does not modify `$_`.
|
1777
|
+
# See [Line IO](rdoc-ref:IO@Line+IO).
|
1778
|
+
#
|
1779
|
+
# With no arguments given, returns lines as determined by line separator `$/`,
|
1780
|
+
# or `nil` if none:
|
1781
|
+
#
|
1782
|
+
# f = File.new('t.txt')
|
1783
|
+
# f.readlines
|
1784
|
+
# # => ["First line\n", "Second line\n", "\n", "Fourth line\n", "Fifth line\n"]
|
1785
|
+
# f.readlines # => []
|
1786
|
+
# f.close
|
1787
|
+
#
|
1788
|
+
# With only string argument `sep` given, returns lines as determined by line
|
1789
|
+
# separator `sep`, or `nil` if none; see [Line
|
1790
|
+
# Separator](rdoc-ref:IO@Line+Separator):
|
1791
|
+
#
|
1792
|
+
# f = File.new('t.txt')
|
1793
|
+
# f.readlines('li')
|
1794
|
+
# # => ["First li", "ne\nSecond li", "ne\n\nFourth li", "ne\nFifth li", "ne\n"]
|
1795
|
+
# f.close
|
1796
|
+
#
|
1797
|
+
# The two special values for `sep` are honored:
|
1798
|
+
#
|
1799
|
+
# f = File.new('t.txt')
|
1800
|
+
# # Get all into one string.
|
1801
|
+
# f.readlines(nil)
|
1802
|
+
# # => ["First line\nSecond line\n\nFourth line\nFifth line\n"]
|
1803
|
+
# # Get paragraphs (up to two line separators).
|
1804
|
+
# f.rewind
|
1805
|
+
# f.readlines('')
|
1806
|
+
# # => ["First line\nSecond line\n\n", "Fourth line\nFifth line\n"]
|
1807
|
+
# f.close
|
1808
|
+
#
|
1809
|
+
# With only integer argument `limit` given, limits the number of bytes in each
|
1810
|
+
# line; see [Line Limit](rdoc-ref:IO@Line+Limit):
|
1715
1811
|
#
|
1716
|
-
|
1717
|
-
|
1718
|
-
#
|
1719
|
-
#
|
1720
|
-
# - ios.readlines(sep=$/ [, getline_args]) -> array
|
1721
|
-
# - ios.readlines(limit [, getline_args]) -> array
|
1722
|
-
# - ios.readlines(sep, limit [, getline_args]) -> array
|
1723
|
-
# -->
|
1724
|
-
# Reads all of the lines in *ios*, and returns them in an array. Lines are
|
1725
|
-
# separated by the optional *sep*. If *sep* is `nil`, the rest of the stream is
|
1726
|
-
# returned as a single record. If the first argument is an integer, or an
|
1727
|
-
# optional second argument is given, the returning string would not be longer
|
1728
|
-
# than the given value in bytes. The stream must be opened for reading or an
|
1729
|
-
# IOError will be raised.
|
1812
|
+
# f = File.new('t.txt')
|
1813
|
+
# f.readlines(8)
|
1814
|
+
# # => ["First li", "ne\n", "Second l", "ine\n", "\n", "Fourth l", "ine\n", "Fifth li", "ne\n"]
|
1815
|
+
# f.close
|
1730
1816
|
#
|
1731
|
-
#
|
1732
|
-
# f.readlines[0] #=> "This is line one\n"
|
1817
|
+
# With arguments `sep` and `limit` given, combines the two behaviors:
|
1733
1818
|
#
|
1734
|
-
#
|
1735
|
-
#
|
1819
|
+
# * Returns lines as determined by line separator `sep`.
|
1820
|
+
# * But returns no more bytes in a line than are allowed by the limit.
|
1736
1821
|
#
|
1737
|
-
#
|
1822
|
+
#
|
1823
|
+
# Optional keyword argument `chomp` specifies whether line separators are to be
|
1824
|
+
# omitted:
|
1825
|
+
#
|
1826
|
+
# f = File.new('t.txt')
|
1827
|
+
# f.readlines(chomp: true)
|
1828
|
+
# # => ["First line", "Second line", "", "Fourth line", "Fifth line"]
|
1829
|
+
# f.close
|
1738
1830
|
#
|
1739
1831
|
def readlines: (?String sep, ?Integer limit) -> ::Array[String]
|
1740
1832
|
|
@@ -1758,20 +1850,21 @@ class IO < Object
|
|
1758
1850
|
# string:
|
1759
1851
|
#
|
1760
1852
|
# f = File.new('t.txt')
|
1761
|
-
# f.readpartial(
|
1762
|
-
# f.readpartial(
|
1763
|
-
# f.readpartial(
|
1764
|
-
# f.
|
1765
|
-
# f.
|
1853
|
+
# f.readpartial(20) # => "First line\nSecond l"
|
1854
|
+
# f.readpartial(20) # => "ine\n\nFourth line\n"
|
1855
|
+
# f.readpartial(20) # => "Fifth line\n"
|
1856
|
+
# f.readpartial(20) # Raises EOFError.
|
1857
|
+
# f.close
|
1766
1858
|
#
|
1767
1859
|
# With both argument `maxlen` and string argument `out_string` given, returns
|
1768
1860
|
# modified `out_string`:
|
1769
1861
|
#
|
1770
1862
|
# f = File.new('t.txt')
|
1771
1863
|
# s = 'foo'
|
1772
|
-
# f.readpartial(
|
1864
|
+
# f.readpartial(20, s) # => "First line\nSecond l"
|
1773
1865
|
# s = 'bar'
|
1774
1866
|
# f.readpartial(0, s) # => ""
|
1867
|
+
# f.close
|
1775
1868
|
#
|
1776
1869
|
# This method is useful for a stream such as a pipe, a socket, or a tty. It
|
1777
1870
|
# blocks only when no data is immediately available. This means that it blocks
|
@@ -1835,18 +1928,34 @@ class IO < Object
|
|
1835
1928
|
|
1836
1929
|
# <!--
|
1837
1930
|
# rdoc-file=io.c
|
1838
|
-
# -
|
1839
|
-
# -
|
1931
|
+
# - reopen(other_io) -> self
|
1932
|
+
# - reopen(path, mode = 'r', **opts) -> self
|
1840
1933
|
# -->
|
1841
|
-
# Reassociates
|
1842
|
-
#
|
1843
|
-
#
|
1934
|
+
# Reassociates the stream with another stream, which may be of a different
|
1935
|
+
# class. This method may be used to redirect an existing stream to a new
|
1936
|
+
# destination.
|
1937
|
+
#
|
1938
|
+
# With argument `other_io` given, reassociates with that stream:
|
1939
|
+
#
|
1940
|
+
# # Redirect $stdin from a file.
|
1941
|
+
# f = File.open('t.txt')
|
1942
|
+
# $stdin.reopen(f)
|
1943
|
+
# f.close
|
1944
|
+
#
|
1945
|
+
# # Redirect $stdout to a file.
|
1946
|
+
# f = File.open('t.tmp', 'w')
|
1947
|
+
# $stdout.reopen(f)
|
1948
|
+
# f.close
|
1949
|
+
#
|
1950
|
+
# With argument `path` given, reassociates with a new stream to that file path:
|
1951
|
+
#
|
1952
|
+
# $stdin.reopen('t.txt')
|
1953
|
+
# $stdout.reopen('t.tmp', 'w')
|
1954
|
+
#
|
1955
|
+
# Optional keyword arguments `opts` specify:
|
1844
1956
|
#
|
1845
|
-
#
|
1846
|
-
#
|
1847
|
-
# f2.readlines[0] #=> "This is line one\n"
|
1848
|
-
# f2.reopen(f1) #=> #<File:testfile>
|
1849
|
-
# f2.readlines[0] #=> "This is line one\n"
|
1957
|
+
# * [Open Options](rdoc-ref:IO@Open+Options).
|
1958
|
+
# * [Encoding options](rdoc-ref:encodings.rdoc@Encoding+Options).
|
1850
1959
|
#
|
1851
1960
|
def reopen: (IO other_IO_or_path) -> IO
|
1852
1961
|
| (String other_IO_or_path, ?String mode_str) -> IO
|
@@ -1856,18 +1965,19 @@ class IO < Object
|
|
1856
1965
|
# - rewind -> 0
|
1857
1966
|
# -->
|
1858
1967
|
# Repositions the stream to its beginning, setting both the position and the
|
1859
|
-
# line number to zero; see [Position](
|
1860
|
-
# Number](
|
1968
|
+
# line number to zero; see [Position](rdoc-ref:IO@Position) and [Line
|
1969
|
+
# Number](rdoc-ref:IO@Line+Number):
|
1861
1970
|
#
|
1862
1971
|
# f = File.open('t.txt')
|
1863
1972
|
# f.tell # => 0
|
1864
1973
|
# f.lineno # => 0
|
1865
|
-
# f.
|
1866
|
-
# f.tell # =>
|
1974
|
+
# f.gets # => "First line\n"
|
1975
|
+
# f.tell # => 12
|
1867
1976
|
# f.lineno # => 1
|
1868
1977
|
# f.rewind # => 0
|
1869
1978
|
# f.tell # => 0
|
1870
1979
|
# f.lineno # => 0
|
1980
|
+
# f.close
|
1871
1981
|
#
|
1872
1982
|
# Note that this method cannot be used with streams such as pipes, ttys, and
|
1873
1983
|
# sockets.
|
@@ -1879,7 +1989,7 @@ class IO < Object
|
|
1879
1989
|
# - seek(offset, whence = IO::SEEK_SET) -> 0
|
1880
1990
|
# -->
|
1881
1991
|
# Seeks to the position given by integer `offset` (see
|
1882
|
-
# [Position](
|
1992
|
+
# [Position](rdoc-ref:IO@Position)) and constant `whence`, which is one of:
|
1883
1993
|
#
|
1884
1994
|
# * `:CUR` or `IO::SEEK_CUR`: Repositions the stream to its current position
|
1885
1995
|
# plus the given `offset`:
|
@@ -1890,6 +2000,7 @@ class IO < Object
|
|
1890
2000
|
# f.tell # => 20
|
1891
2001
|
# f.seek(-10, :CUR) # => 0
|
1892
2002
|
# f.tell # => 10
|
2003
|
+
# f.close
|
1893
2004
|
#
|
1894
2005
|
# * `:END` or `IO::SEEK_END`: Repositions the stream to its end plus the given
|
1895
2006
|
# `offset`:
|
@@ -1897,11 +2008,12 @@ class IO < Object
|
|
1897
2008
|
# f = File.open('t.txt')
|
1898
2009
|
# f.tell # => 0
|
1899
2010
|
# f.seek(0, :END) # => 0 # Repositions to stream end.
|
1900
|
-
# f.tell # =>
|
2011
|
+
# f.tell # => 52
|
1901
2012
|
# f.seek(-20, :END) # => 0
|
1902
|
-
# f.tell # =>
|
2013
|
+
# f.tell # => 32
|
1903
2014
|
# f.seek(-40, :END) # => 0
|
1904
|
-
# f.tell # =>
|
2015
|
+
# f.tell # => 12
|
2016
|
+
# f.close
|
1905
2017
|
#
|
1906
2018
|
# * `:SET` or `IO:SEEK_SET`: Repositions the stream to the given `offset`:
|
1907
2019
|
#
|
@@ -1911,6 +2023,7 @@ class IO < Object
|
|
1911
2023
|
# f.tell # => 20
|
1912
2024
|
# f.seek(40, :SET) # => 0
|
1913
2025
|
# f.tell # => 40
|
2026
|
+
# f.close
|
1914
2027
|
#
|
1915
2028
|
#
|
1916
2029
|
# Related: IO#pos=, IO#tell.
|
@@ -1919,39 +2032,49 @@ class IO < Object
|
|
1919
2032
|
|
1920
2033
|
# <!--
|
1921
2034
|
# rdoc-file=io.c
|
1922
|
-
# -
|
1923
|
-
# -
|
1924
|
-
# -
|
1925
|
-
# - io.set_encoding("ext_enc:int_enc", opt) -> io
|
1926
|
-
# - io.set_encoding(ext_enc, int_enc, opt) -> io
|
2035
|
+
# - set_encoding(ext_enc) -> self
|
2036
|
+
# - set_encoding(ext_enc, int_enc, **enc_opts) -> self
|
2037
|
+
# - set_encoding('ext_enc:int_enc', **enc_opts) -> self
|
1927
2038
|
# -->
|
1928
|
-
#
|
1929
|
-
#
|
1930
|
-
#
|
1931
|
-
#
|
1932
|
-
#
|
1933
|
-
#
|
1934
|
-
#
|
1935
|
-
#
|
2039
|
+
# See [Encodings](rdoc-ref:File@Encodings).
|
2040
|
+
#
|
2041
|
+
# Argument `ext_enc`, if given, must be an Encoding object; it is assigned as
|
2042
|
+
# the encoding for the stream.
|
2043
|
+
#
|
2044
|
+
# Argument `int_enc`, if given, must be an Encoding object; it is assigned as
|
2045
|
+
# the encoding for the internal string.
|
2046
|
+
#
|
2047
|
+
# Argument `'ext_enc:int_enc'`, if given, is a string containing two
|
2048
|
+
# colon-separated encoding names; corresponding Encoding objects are assigned as
|
2049
|
+
# the external and internal encodings for the stream.
|
2050
|
+
#
|
2051
|
+
# Optional keyword arguments `enc_opts` specify [Encoding
|
2052
|
+
# options](rdoc-ref:encodings.rdoc@Encoding+Options).
|
1936
2053
|
#
|
1937
2054
|
def set_encoding: (?String | Encoding ext_or_ext_int_enc) -> self
|
1938
2055
|
| (?String | Encoding ext_or_ext_int_enc, ?String | Encoding int_enc) -> self
|
1939
2056
|
|
1940
2057
|
# <!--
|
1941
2058
|
# rdoc-file=io.c
|
1942
|
-
# -
|
2059
|
+
# - set_encoding_by_bom -> encoding or nil
|
1943
2060
|
# -->
|
1944
|
-
#
|
1945
|
-
#
|
1946
|
-
#
|
2061
|
+
# If the stream begins with a BOM ([byte order
|
2062
|
+
# marker](https://en.wikipedia.org/wiki/Byte_order_mark)), consumes the BOM and
|
2063
|
+
# sets the external encoding accordingly; returns the result encoding if found,
|
2064
|
+
# or `nil` otherwise:
|
2065
|
+
#
|
2066
|
+
# File.write('t.tmp', "\u{FEFF}abc")
|
2067
|
+
# io = File.open('t.tmp', 'rb')
|
2068
|
+
# io.set_encoding_by_bom # => #<Encoding:UTF-8>
|
2069
|
+
# io.close
|
1947
2070
|
#
|
1948
|
-
# File.write(
|
1949
|
-
#
|
1950
|
-
#
|
2071
|
+
# File.write('t.tmp', 'abc')
|
2072
|
+
# io = File.open('t.tmp', 'rb')
|
2073
|
+
# io.set_encoding_by_bom # => nil
|
2074
|
+
# io.close
|
1951
2075
|
#
|
1952
|
-
#
|
1953
|
-
#
|
1954
|
-
# ios.set_encoding_by_bom #=> nil
|
2076
|
+
# Raises an exception if the stream is not binmode or its encoding has already
|
2077
|
+
# been set.
|
1955
2078
|
#
|
1956
2079
|
def set_encoding_by_bom: () -> Encoding?
|
1957
2080
|
|
@@ -1981,6 +2104,7 @@ class IO < Object
|
|
1981
2104
|
# f.sync # => false
|
1982
2105
|
# f.sync = true
|
1983
2106
|
# f.sync # => true
|
2107
|
+
# f.close
|
1984
2108
|
#
|
1985
2109
|
def sync: () -> bool
|
1986
2110
|
|
@@ -2004,6 +2128,7 @@ class IO < Object
|
|
2004
2128
|
# f.sync # => false
|
2005
2129
|
# f.sync = true
|
2006
2130
|
# f.sync # => true
|
2131
|
+
# f.close
|
2007
2132
|
#
|
2008
2133
|
# Related: IO#fsync.
|
2009
2134
|
#
|
@@ -2011,46 +2136,41 @@ class IO < Object
|
|
2011
2136
|
|
2012
2137
|
# <!--
|
2013
2138
|
# rdoc-file=io.c
|
2014
|
-
# -
|
2139
|
+
# - sysread(maxlen) -> string
|
2140
|
+
# - sysread(maxlen, out_string) -> string
|
2015
2141
|
# -->
|
2016
|
-
#
|
2017
|
-
# string. Do not mix with other methods that read from *ios* or you may get
|
2018
|
-
# unpredictable results.
|
2142
|
+
# Behaves like IO#readpartial, except that it uses low-level system functions.
|
2019
2143
|
#
|
2020
|
-
#
|
2021
|
-
# which will receive the data. The *outbuf* will contain only the received data
|
2022
|
-
# after the method call even if it is not empty at the beginning.
|
2023
|
-
#
|
2024
|
-
# Raises SystemCallError on error and EOFError at end of file.
|
2025
|
-
#
|
2026
|
-
# f = File.new("testfile")
|
2027
|
-
# f.sysread(16) #=> "This is line one"
|
2144
|
+
# This method should not be used with other stream-reader methods.
|
2028
2145
|
#
|
2029
2146
|
def sysread: (Integer maxlen, String outbuf) -> String
|
2030
2147
|
|
2031
2148
|
# <!--
|
2032
2149
|
# rdoc-file=io.c
|
2033
|
-
# -
|
2150
|
+
# - sysseek(offset, whence = IO::SEEK_SET) -> integer
|
2034
2151
|
# -->
|
2035
|
-
#
|
2036
|
-
# (see IO#seek for values of *whence*). Returns the new offset into the file.
|
2152
|
+
# Behaves like IO#seek, except that it:
|
2037
2153
|
#
|
2038
|
-
#
|
2039
|
-
#
|
2040
|
-
# f.sysread(10) #=> "And so on."
|
2154
|
+
# * Uses low-level system functions.
|
2155
|
+
# * Returns the new position.
|
2041
2156
|
#
|
2042
2157
|
def sysseek: (Integer amount, ?Integer whence) -> Integer
|
2043
2158
|
|
2044
2159
|
# <!--
|
2045
2160
|
# rdoc-file=io.c
|
2046
|
-
# -
|
2161
|
+
# - syswrite(object) -> integer
|
2047
2162
|
# -->
|
2048
|
-
# Writes the given
|
2049
|
-
#
|
2050
|
-
#
|
2163
|
+
# Writes the given `object` to self, which must be opened for writing (see
|
2164
|
+
# Modes); returns the number bytes written. If `object` is not a string is
|
2165
|
+
# converted via method to_s:
|
2166
|
+
#
|
2167
|
+
# f = File.new('t.tmp', 'w')
|
2168
|
+
# f.syswrite('foo') # => 3
|
2169
|
+
# f.syswrite(30) # => 2
|
2170
|
+
# f.syswrite(:foo) # => 3
|
2171
|
+
# f.close
|
2051
2172
|
#
|
2052
|
-
#
|
2053
|
-
# f.syswrite("ABCDEF") #=> 6
|
2173
|
+
# This methods should not be used with other stream-writer methods.
|
2054
2174
|
#
|
2055
2175
|
def syswrite: (_ToS arg0) -> Integer
|
2056
2176
|
|
@@ -2059,12 +2179,13 @@ class IO < Object
|
|
2059
2179
|
# - tell -> integer
|
2060
2180
|
# -->
|
2061
2181
|
# Returns the current position (in bytes) in `self` (see
|
2062
|
-
# [Position](
|
2182
|
+
# [Position](rdoc-ref:IO@Position)):
|
2063
2183
|
#
|
2064
|
-
# f = File.
|
2065
|
-
# f.tell
|
2066
|
-
# f.
|
2067
|
-
# f.tell
|
2184
|
+
# f = File.open('t.txt')
|
2185
|
+
# f.tell # => 0
|
2186
|
+
# f.gets # => "First line\n"
|
2187
|
+
# f.tell # => 12
|
2188
|
+
# f.close
|
2068
2189
|
#
|
2069
2190
|
# Related: IO#pos=, IO#seek.
|
2070
2191
|
#
|
@@ -2072,6 +2193,34 @@ class IO < Object
|
|
2072
2193
|
#
|
2073
2194
|
def tell: () -> Integer
|
2074
2195
|
|
2196
|
+
# <!--
|
2197
|
+
# rdoc-file=io.c
|
2198
|
+
# - timeout -> duration or nil
|
2199
|
+
# -->
|
2200
|
+
# Get the internal timeout duration or nil if it was not set.
|
2201
|
+
#
|
2202
|
+
def timeout: () -> Numeric?
|
2203
|
+
|
2204
|
+
# <!--
|
2205
|
+
# rdoc-file=io.c
|
2206
|
+
# - timeout = duration -> duration
|
2207
|
+
# - timeout = nil -> nil
|
2208
|
+
# -->
|
2209
|
+
# Set the internal timeout to the specified duration or nil. The timeout applies
|
2210
|
+
# to all blocking operations where possible.
|
2211
|
+
#
|
2212
|
+
# This affects the following methods (but is not limited to): #gets, #puts,
|
2213
|
+
# #read, #write, #wait_readable and #wait_writable. This also affects blocking
|
2214
|
+
# socket operations like Socket#accept and Socket#connect.
|
2215
|
+
#
|
2216
|
+
# Some operations like File#open and IO#close are not affected by the timeout. A
|
2217
|
+
# timeout during a write operation may leave the IO in an inconsistent state,
|
2218
|
+
# e.g. data was partially written. Generally speaking, a timeout is a last ditch
|
2219
|
+
# effort to prevent an application from hanging on slow I/O operations, such as
|
2220
|
+
# those that occur during a slowloris attack.
|
2221
|
+
#
|
2222
|
+
def timeout=: (Numeric?) -> void
|
2223
|
+
|
2075
2224
|
# <!--
|
2076
2225
|
# rdoc-file=io.c
|
2077
2226
|
# - to_io -> self
|
@@ -2081,78 +2230,98 @@ class IO < Object
|
|
2081
2230
|
def to_io: () -> self
|
2082
2231
|
|
2083
2232
|
# <!-- rdoc-file=io.c -->
|
2084
|
-
# Returns `true` if
|
2085
|
-
# otherwise
|
2233
|
+
# Returns `true` if the stream is associated with a terminal device (tty),
|
2234
|
+
# `false` otherwise:
|
2235
|
+
#
|
2236
|
+
# f = File.new('t.txt').isatty #=> false
|
2237
|
+
# f.close
|
2238
|
+
# f = File.new('/dev/tty').isatty #=> true
|
2239
|
+
# f.close
|
2086
2240
|
#
|
2087
|
-
#
|
2088
|
-
# File.new("/dev/tty").isatty #=> true
|
2241
|
+
# IO#tty? is an alias for IO#isatty.
|
2089
2242
|
#
|
2090
2243
|
def tty?: () -> bool
|
2091
2244
|
|
2092
2245
|
# <!--
|
2093
2246
|
# rdoc-file=io.c
|
2094
|
-
# -
|
2095
|
-
# -
|
2247
|
+
# - ungetbyte(integer) -> nil
|
2248
|
+
# - ungetbyte(string) -> nil
|
2096
2249
|
# -->
|
2097
|
-
# Pushes back
|
2098
|
-
#
|
2099
|
-
#
|
2100
|
-
# previous read of at least a single byte from *ios*. However, it can support
|
2101
|
-
# additional bytes if there is space in the internal buffer to allow for it.
|
2250
|
+
# Pushes back ("unshifts") the given data onto the stream's buffer, placing the
|
2251
|
+
# data so that it is next to be read; returns `nil`. See [Byte
|
2252
|
+
# IO](rdoc-ref:IO@Byte+IO).
|
2102
2253
|
#
|
2103
|
-
#
|
2104
|
-
# b = f.getbyte #=> 0x38
|
2105
|
-
# f.ungetbyte(b) #=> nil
|
2106
|
-
# f.getbyte #=> 0x38
|
2254
|
+
# Note that:
|
2107
2255
|
#
|
2108
|
-
#
|
2109
|
-
#
|
2256
|
+
# * Calling the method has no effect with unbuffered reads (such as
|
2257
|
+
# IO#sysread).
|
2258
|
+
# * Calling #rewind on the stream discards the pushed-back data.
|
2110
2259
|
#
|
2111
|
-
# f = File.new("testfile") #=> #<File:testfile>
|
2112
|
-
# f.ungetbyte(0x102) #=> nil
|
2113
|
-
# f.getbyte #=> 0x2
|
2114
2260
|
#
|
2115
|
-
#
|
2116
|
-
# already been called previously:
|
2261
|
+
# When argument `integer` is given, uses only its low-order byte:
|
2117
2262
|
#
|
2118
|
-
#
|
2119
|
-
# f.
|
2120
|
-
# f.ungetbyte(
|
2121
|
-
# f.read
|
2263
|
+
# File.write('t.tmp', '012')
|
2264
|
+
# f = File.open('t.tmp')
|
2265
|
+
# f.ungetbyte(0x41) # => nil
|
2266
|
+
# f.read # => "A012"
|
2267
|
+
# f.rewind
|
2268
|
+
# f.ungetbyte(0x4243) # => nil
|
2269
|
+
# f.read # => "C012"
|
2270
|
+
# f.close
|
2122
2271
|
#
|
2123
|
-
#
|
2272
|
+
# When argument `string` is given, uses all bytes:
|
2273
|
+
#
|
2274
|
+
# File.write('t.tmp', '012')
|
2275
|
+
# f = File.open('t.tmp')
|
2276
|
+
# f.ungetbyte('A') # => nil
|
2277
|
+
# f.read # => "A012"
|
2278
|
+
# f.rewind
|
2279
|
+
# f.ungetbyte('BCDE') # => nil
|
2280
|
+
# f.read # => "BCDE012"
|
2281
|
+
# f.close
|
2124
2282
|
#
|
2125
2283
|
def ungetbyte: (String | Integer arg0) -> NilClass
|
2126
2284
|
|
2127
2285
|
# <!--
|
2128
2286
|
# rdoc-file=io.c
|
2129
|
-
# -
|
2130
|
-
# -
|
2287
|
+
# - ungetc(integer) -> nil
|
2288
|
+
# - ungetc(string) -> nil
|
2131
2289
|
# -->
|
2132
|
-
# Pushes back
|
2133
|
-
#
|
2134
|
-
#
|
2135
|
-
#
|
2136
|
-
#
|
2137
|
-
# allow for it.
|
2290
|
+
# Pushes back ("unshifts") the given data onto the stream's buffer, placing the
|
2291
|
+
# data so that it is next to be read; returns `nil`. See [Character
|
2292
|
+
# IO](rdoc-ref:IO@Character+IO).
|
2293
|
+
#
|
2294
|
+
# Note that:
|
2138
2295
|
#
|
2139
|
-
#
|
2140
|
-
#
|
2141
|
-
#
|
2142
|
-
# f.getc #=> "8"
|
2296
|
+
# * Calling the method has no effect with unbuffered reads (such as
|
2297
|
+
# IO#sysread).
|
2298
|
+
# * Calling #rewind on the stream discards the pushed-back data.
|
2143
2299
|
#
|
2144
|
-
# If given an integer, the integer must represent a valid codepoint in the
|
2145
|
-
# external encoding of *ios*.
|
2146
2300
|
#
|
2147
|
-
#
|
2148
|
-
#
|
2301
|
+
# When argument `integer` is given, interprets the integer as a character:
|
2302
|
+
#
|
2303
|
+
# File.write('t.tmp', '012')
|
2304
|
+
# f = File.open('t.tmp')
|
2305
|
+
# f.ungetc(0x41) # => nil
|
2306
|
+
# f.read # => "A012"
|
2307
|
+
# f.rewind
|
2308
|
+
# f.ungetc(0x0442) # => nil
|
2309
|
+
# f.getc.ord # => 1090
|
2310
|
+
# f.close
|
2149
2311
|
#
|
2150
|
-
#
|
2151
|
-
# f.ungetc("ab") #=> nil
|
2152
|
-
# f.ungetc("cd") #=> nil
|
2153
|
-
# f.read(5) #=> "cdab8"
|
2312
|
+
# When argument `string` is given, uses all characters:
|
2154
2313
|
#
|
2155
|
-
#
|
2314
|
+
# File.write('t.tmp', '012')
|
2315
|
+
# f = File.open('t.tmp')
|
2316
|
+
# f.ungetc('A') # => nil
|
2317
|
+
# f.read # => "A012"
|
2318
|
+
# f.rewind
|
2319
|
+
# f.ungetc("\u0442\u0435\u0441\u0442") # => nil
|
2320
|
+
# f.getc.ord # => 1090
|
2321
|
+
# f.getc.ord # => 1077
|
2322
|
+
# f.getc.ord # => 1089
|
2323
|
+
# f.getc.ord # => 1090
|
2324
|
+
# f.close
|
2156
2325
|
#
|
2157
2326
|
def ungetc: (String arg0) -> NilClass
|
2158
2327
|
|
@@ -2161,8 +2330,9 @@ class IO < Object
|
|
2161
2330
|
# - write(*objects) -> integer
|
2162
2331
|
# -->
|
2163
2332
|
# Writes each of the given `objects` to `self`, which must be opened for writing
|
2164
|
-
# (see [Modes](
|
2165
|
-
# each of `objects` that is not a string is converted via method
|
2333
|
+
# (see [Access Modes](rdoc-ref:File@Access+Modes)); returns the total number
|
2334
|
+
# bytes written; each of `objects` that is not a string is converted via method
|
2335
|
+
# `to_s`:
|
2166
2336
|
#
|
2167
2337
|
# $stdout.write('Hello', ', ', 'World!', "\n") # => 14
|
2168
2338
|
# $stdout.write('foo', :bar, 2, "\n") # => 8
|
@@ -2172,6 +2342,8 @@ class IO < Object
|
|
2172
2342
|
# Hello, World!
|
2173
2343
|
# foobar2
|
2174
2344
|
#
|
2345
|
+
# Related: IO#read.
|
2346
|
+
#
|
2175
2347
|
def write: (*_ToS string) -> Integer
|
2176
2348
|
|
2177
2349
|
# <!--
|
@@ -2233,145 +2405,237 @@ class IO < Object
|
|
2233
2405
|
|
2234
2406
|
# <!--
|
2235
2407
|
# rdoc-file=io.c
|
2236
|
-
# - IO.binread(
|
2237
|
-
# -
|
2408
|
+
# - IO.binread(command, length = nil, offset = 0) -> string or nil
|
2409
|
+
# - IO.binread(path, length = nil, offset = 0) -> string or nil
|
2238
2410
|
# -->
|
2239
|
-
#
|
2240
|
-
#
|
2241
|
-
# closed before returning. The open mode would be `"rb:ASCII-8BIT"`.
|
2411
|
+
# Behaves like IO.read, except that the stream is opened in binary mode with
|
2412
|
+
# ASCII-8BIT encoding.
|
2242
2413
|
#
|
2243
|
-
#
|
2244
|
-
#
|
2245
|
-
#
|
2246
|
-
# subprocess invocation.
|
2247
|
-
#
|
2248
|
-
# File.binread("testfile") #=> "This is line one\nThis is line two\nThis is line three\nAnd so on...\n"
|
2249
|
-
# File.binread("testfile", 20) #=> "This is line one\nThi"
|
2250
|
-
# File.binread("testfile", 20, 10) #=> "ne one\nThis is line "
|
2251
|
-
# IO.binread("| cat testfile") #=> "This is line one\nThis is line two\nThis is line three\nAnd so on...\n"
|
2252
|
-
#
|
2253
|
-
# See also IO.read for details about `name` and open_args.
|
2414
|
+
# When called from class IO (but not subclasses of IO), this method has
|
2415
|
+
# potential security vulnerabilities if called with untrusted input; see
|
2416
|
+
# [Command Injection](rdoc-ref:command_injection.rdoc).
|
2254
2417
|
#
|
2255
2418
|
def self.binread: (String name, ?Integer length, ?Integer offset) -> String
|
2256
2419
|
|
2257
2420
|
# <!--
|
2258
2421
|
# rdoc-file=io.c
|
2259
|
-
# - IO.binwrite(
|
2260
|
-
# - IO.binwrite(
|
2261
|
-
# - File.binwrite(name, string, [offset]) -> integer
|
2262
|
-
# - File.binwrite(name, string, [offset], open_args) -> integer
|
2422
|
+
# - IO.binwrite(command, string, offset = 0) -> integer
|
2423
|
+
# - IO.binwrite(path, string, offset = 0) -> integer
|
2263
2424
|
# -->
|
2264
|
-
#
|
2265
|
-
#
|
2425
|
+
# Behaves like IO.write, except that the stream is opened in binary mode with
|
2426
|
+
# ASCII-8BIT encoding.
|
2266
2427
|
#
|
2267
|
-
#
|
2268
|
-
#
|
2269
|
-
#
|
2270
|
-
# subprocess invocation.
|
2271
|
-
#
|
2272
|
-
# See also IO.read for details about `name` and open_args.
|
2428
|
+
# When called from class IO (but not subclasses of IO), this method has
|
2429
|
+
# potential security vulnerabilities if called with untrusted input; see
|
2430
|
+
# [Command Injection](rdoc-ref:command_injection.rdoc).
|
2273
2431
|
#
|
2274
2432
|
def self.binwrite: (String name, _ToS string, ?Integer offset, ?mode: String mode) -> Integer
|
2275
2433
|
|
2276
2434
|
# <!--
|
2277
2435
|
# rdoc-file=io.c
|
2278
|
-
# - IO.copy_stream(src, dst)
|
2279
|
-
# - IO.copy_stream(src, dst, copy_length)
|
2280
|
-
# - IO.copy_stream(src, dst, copy_length, src_offset)
|
2436
|
+
# - IO.copy_stream(src, dst, src_length = nil, src_offset = 0) -> integer
|
2281
2437
|
# -->
|
2282
|
-
#
|
2283
|
-
#
|
2284
|
-
#
|
2285
|
-
#
|
2286
|
-
#
|
2438
|
+
# Copies from the given `src` to the given `dst`, returning the number of bytes
|
2439
|
+
# copied.
|
2440
|
+
#
|
2441
|
+
# * The given `src` must be one of the following:
|
2442
|
+
#
|
2443
|
+
# * The path to a readable file, from which source data is to be read.
|
2444
|
+
# * An IO-like object, opened for reading and capable of responding to
|
2445
|
+
# method `:readpartial` or method `:read`.
|
2446
|
+
#
|
2447
|
+
#
|
2448
|
+
# * The given `dst` must be one of the following:
|
2449
|
+
#
|
2450
|
+
# * The path to a writable file, to which data is to be written.
|
2451
|
+
# * An IO-like object, opened for writing and capable of responding to
|
2452
|
+
# method `:write`.
|
2287
2453
|
#
|
2288
|
-
# This method returns the number of bytes copied.
|
2289
2454
|
#
|
2290
|
-
# If optional arguments are not given, the start position of the copy is the
|
2291
|
-
# beginning of the filename or the current file offset of the IO. The end
|
2292
|
-
# position of the copy is the end of file.
|
2293
2455
|
#
|
2294
|
-
#
|
2456
|
+
# The examples here use file `t.txt` as source:
|
2295
2457
|
#
|
2296
|
-
#
|
2458
|
+
# File.read('t.txt')
|
2459
|
+
# # => "First line\nSecond line\n\nThird line\nFourth line\n"
|
2460
|
+
# File.read('t.txt').size # => 47
|
2297
2461
|
#
|
2298
|
-
#
|
2299
|
-
#
|
2462
|
+
# If only arguments `src` and `dst` are given, the entire source stream is
|
2463
|
+
# copied:
|
2464
|
+
#
|
2465
|
+
# # Paths.
|
2466
|
+
# IO.copy_stream('t.txt', 't.tmp') # => 47
|
2467
|
+
#
|
2468
|
+
# # IOs (recall that a File is also an IO).
|
2469
|
+
# src_io = File.open('t.txt', 'r') # => #<File:t.txt>
|
2470
|
+
# dst_io = File.open('t.tmp', 'w') # => #<File:t.tmp>
|
2471
|
+
# IO.copy_stream(src_io, dst_io) # => 47
|
2472
|
+
# src_io.close
|
2473
|
+
# dst_io.close
|
2474
|
+
#
|
2475
|
+
# With argument `src_length` a non-negative integer, no more than that many
|
2476
|
+
# bytes are copied:
|
2477
|
+
#
|
2478
|
+
# IO.copy_stream('t.txt', 't.tmp', 10) # => 10
|
2479
|
+
# File.read('t.tmp') # => "First line"
|
2480
|
+
#
|
2481
|
+
# With argument `src_offset` also given, the source stream is read beginning at
|
2482
|
+
# that offset:
|
2483
|
+
#
|
2484
|
+
# IO.copy_stream('t.txt', 't.tmp', 11, 11) # => 11
|
2485
|
+
# IO.read('t.tmp') # => "Second line"
|
2300
2486
|
#
|
2301
2487
|
def self.copy_stream: (String | _Reader | _ReaderPartial src, String | _Writer dst, ?Integer copy_length, ?Integer src_offset) -> Integer
|
2302
2488
|
|
2303
2489
|
# <!--
|
2304
2490
|
# rdoc-file=io.c
|
2305
|
-
# - IO.popen(
|
2306
|
-
# - IO.popen(
|
2491
|
+
# - IO.popen(env = {}, cmd, mode = 'r', **opts) -> io
|
2492
|
+
# - IO.popen(env = {}, cmd, mode = 'r', **opts) {|io| ... } -> object
|
2307
2493
|
# -->
|
2308
|
-
#
|
2309
|
-
#
|
2494
|
+
# Executes the given command `cmd` as a subprocess whose $stdin and $stdout are
|
2495
|
+
# connected to a new stream `io`.
|
2310
2496
|
#
|
2311
|
-
#
|
2497
|
+
# This method has potential security vulnerabilities if called with untrusted
|
2498
|
+
# input; see [Command Injection](rdoc-ref:command_injection.rdoc).
|
2312
2499
|
#
|
2313
|
-
#
|
2500
|
+
# If no block is given, returns the new stream, which depending on given `mode`
|
2501
|
+
# may be open for reading, writing, or both. The stream should be explicitly
|
2502
|
+
# closed (eventually) to avoid resource leaks.
|
2314
2503
|
#
|
2315
|
-
#
|
2316
|
-
#
|
2317
|
-
#
|
2318
|
-
# [env, cmdname, arg1, ..., opts] : command name and zero or more arguments (no shell)
|
2319
|
-
# [env, [cmdname, argv0], arg1, ..., opts] : command name, argv[0] and zero or more arguments (no shell)
|
2320
|
-
# (env and opts are optional.)
|
2504
|
+
# If a block is given, the stream is passed to the block (again, open for
|
2505
|
+
# reading, writing, or both); when the block exits, the stream is closed, and
|
2506
|
+
# the block's value is assigned to global variable `$?` and returned.
|
2321
2507
|
#
|
2322
|
-
#
|
2323
|
-
#
|
2508
|
+
# Optional argument `mode` may be any valid IO mode. See [Access
|
2509
|
+
# Modes](rdoc-ref:File@Access+Modes).
|
2324
2510
|
#
|
2325
|
-
#
|
2326
|
-
# `argv` bypassing a shell. The array can contain a hash at first for
|
2327
|
-
# environments and a hash at last for options similar to #spawn.
|
2511
|
+
# Required argument `cmd` determines which of the following occurs:
|
2328
2512
|
#
|
2329
|
-
# The
|
2330
|
-
#
|
2331
|
-
# *
|
2513
|
+
# * The process forks.
|
2514
|
+
# * A specified program runs in a shell.
|
2515
|
+
# * A specified program runs with specified arguments.
|
2516
|
+
# * A specified program runs with specified arguments and a specified `argv0`.
|
2332
2517
|
#
|
2333
|
-
# # set IO encoding
|
2334
|
-
# IO.popen("nkf -e filename", :external_encoding=>"EUC-JP") {|nkf_io|
|
2335
|
-
# euc_jp_string = nkf_io.read
|
2336
|
-
# }
|
2337
2518
|
#
|
2338
|
-
#
|
2339
|
-
# # spawn option. See the document of Kernel.spawn.
|
2340
|
-
# IO.popen(["ls", "/", :err=>[:child, :out]]) {|ls_io|
|
2341
|
-
# ls_result_with_error = ls_io.read
|
2342
|
-
# }
|
2519
|
+
# Each of these is detailed below.
|
2343
2520
|
#
|
2344
|
-
#
|
2345
|
-
#
|
2346
|
-
# ls_result_with_error = ls_io.read
|
2347
|
-
# }
|
2521
|
+
# The optional hash argument `env` specifies name/value pairs that are to be
|
2522
|
+
# added to the environment variables for the subprocess:
|
2348
2523
|
#
|
2349
|
-
#
|
2524
|
+
# IO.popen({'FOO' => 'bar'}, 'ruby', 'r+') do |pipe|
|
2525
|
+
# pipe.puts 'puts ENV["FOO"]'
|
2526
|
+
# pipe.close_write
|
2527
|
+
# pipe.gets
|
2528
|
+
# end => "bar\n"
|
2350
2529
|
#
|
2351
|
-
#
|
2352
|
-
# with a pipe. Ruby's end of the pipe will be passed as a parameter to the
|
2353
|
-
# block. At the end of block, Ruby closes the pipe and sets `$?`. In this case
|
2354
|
-
# IO.popen returns the value of the block.
|
2530
|
+
# Optional keyword arguments `opts` specify:
|
2355
2531
|
#
|
2356
|
-
#
|
2357
|
-
#
|
2358
|
-
#
|
2359
|
-
# version of the block will be passed `nil`, and the child's standard in and
|
2360
|
-
# standard out will be connected to the parent through the pipe. Not available
|
2361
|
-
# on all platforms.
|
2532
|
+
# * [Open options](rdoc-ref:IO@Open+Options).
|
2533
|
+
# * [Encoding options](rdoc-ref:encodings.rdoc@Encoding+Options).
|
2534
|
+
# * Options for Kernel#spawn.
|
2362
2535
|
#
|
2363
|
-
#
|
2364
|
-
#
|
2365
|
-
#
|
2366
|
-
#
|
2367
|
-
#
|
2368
|
-
# IO.popen(
|
2369
|
-
#
|
2370
|
-
#
|
2371
|
-
#
|
2536
|
+
#
|
2537
|
+
# **Forked \Process**
|
2538
|
+
#
|
2539
|
+
# When argument `cmd` is the 1-character string `'-'`, causes the process to
|
2540
|
+
# fork:
|
2541
|
+
# IO.popen('-') do |pipe|
|
2542
|
+
# if pipe
|
2543
|
+
# $stderr.puts "In parent, child pid is #{pipe.pid}\n"
|
2544
|
+
# else
|
2545
|
+
# $stderr.puts "In child, pid is #{$$}\n"
|
2546
|
+
# end
|
2547
|
+
# end
|
2548
|
+
#
|
2549
|
+
# Output:
|
2550
|
+
#
|
2551
|
+
# In parent, child pid is 26253
|
2552
|
+
# In child, pid is 26253
|
2553
|
+
#
|
2554
|
+
# Note that this is not supported on all platforms.
|
2555
|
+
#
|
2556
|
+
# **Shell Subprocess**
|
2557
|
+
#
|
2558
|
+
# When argument `cmd` is a single string (but not `'-'`), the program named
|
2559
|
+
# `cmd` is run as a shell command:
|
2560
|
+
#
|
2561
|
+
# IO.popen('uname') do |pipe|
|
2562
|
+
# pipe.readlines
|
2563
|
+
# end
|
2564
|
+
#
|
2565
|
+
# Output:
|
2566
|
+
#
|
2567
|
+
# ["Linux\n"]
|
2568
|
+
#
|
2569
|
+
# Another example:
|
2570
|
+
#
|
2571
|
+
# IO.popen('/bin/sh', 'r+') do |pipe|
|
2572
|
+
# pipe.puts('ls')
|
2573
|
+
# pipe.close_write
|
2574
|
+
# $stderr.puts pipe.readlines.size
|
2575
|
+
# end
|
2576
|
+
#
|
2577
|
+
# Output:
|
2578
|
+
#
|
2579
|
+
# 213
|
2580
|
+
#
|
2581
|
+
# **Program Subprocess**
|
2582
|
+
#
|
2583
|
+
# When argument `cmd` is an array of strings, the program named `cmd[0]` is run
|
2584
|
+
# with all elements of `cmd` as its arguments:
|
2585
|
+
#
|
2586
|
+
# IO.popen(['du', '..', '.']) do |pipe|
|
2587
|
+
# $stderr.puts pipe.readlines.size
|
2588
|
+
# end
|
2589
|
+
#
|
2590
|
+
# Output:
|
2591
|
+
#
|
2592
|
+
# 1111
|
2593
|
+
#
|
2594
|
+
# **Program Subprocess with `argv0`**
|
2595
|
+
#
|
2596
|
+
# When argument `cmd` is an array whose first element is a 2-element string
|
2597
|
+
# array and whose remaining elements (if any) are strings:
|
2598
|
+
#
|
2599
|
+
# * `cmd[0][0]` (the first string in the nested array) is the name of a
|
2600
|
+
# program that is run.
|
2601
|
+
# * `cmd[0][1]` (the second string in the nested array) is set as the
|
2602
|
+
# program's `argv[0]`.
|
2603
|
+
# * `cmd[1..-1]` (the strings in the outer array) are the program's arguments.
|
2604
|
+
#
|
2605
|
+
#
|
2606
|
+
# Example (sets `$0` to 'foo'):
|
2607
|
+
#
|
2608
|
+
# IO.popen([['/bin/sh', 'foo'], '-c', 'echo $0']).read # => "foo\n"
|
2609
|
+
#
|
2610
|
+
# **Some Special Examples**
|
2611
|
+
#
|
2612
|
+
# # Set IO encoding.
|
2613
|
+
# IO.popen("nkf -e filename", :external_encoding=>"EUC-JP") {|nkf_io|
|
2614
|
+
# euc_jp_string = nkf_io.read
|
2372
2615
|
# }
|
2373
2616
|
#
|
2374
|
-
#
|
2617
|
+
# # Merge standard output and standard error using Kernel#spawn option. See Kernel#spawn.
|
2618
|
+
# IO.popen(["ls", "/", :err=>[:child, :out]]) do |io|
|
2619
|
+
# ls_result_with_error = io.read
|
2620
|
+
# end
|
2621
|
+
#
|
2622
|
+
# # Use mixture of spawn options and IO options.
|
2623
|
+
# IO.popen(["ls", "/"], :err=>[:child, :out]) do |io|
|
2624
|
+
# ls_result_with_error = io.read
|
2625
|
+
# end
|
2626
|
+
#
|
2627
|
+
# f = IO.popen("uname")
|
2628
|
+
# p f.readlines
|
2629
|
+
# f.close
|
2630
|
+
# puts "Parent is #{Process.pid}"
|
2631
|
+
# IO.popen("date") {|f| puts f.gets }
|
2632
|
+
# IO.popen("-") {|f| $stderr.puts "#{Process.pid} is here, f is #{f.inspect}"}
|
2633
|
+
# p $?
|
2634
|
+
# IO.popen(%w"sed -e s|^|<foo>| -e s&$&;zot;&", "r+") {|f|
|
2635
|
+
# f.puts "bar"; f.close_write; puts f.gets
|
2636
|
+
# }
|
2637
|
+
#
|
2638
|
+
# Output (from last section):
|
2375
2639
|
#
|
2376
2640
|
# ["Linux\n"]
|
2377
2641
|
# Parent is 21346
|
@@ -2381,79 +2645,162 @@ class IO < Object
|
|
2381
2645
|
# #<Process::Status: pid 21352 exit 0>
|
2382
2646
|
# <foo>bar;zot;
|
2383
2647
|
#
|
2648
|
+
# Raises exceptions that IO.pipe and Kernel.spawn raise.
|
2649
|
+
#
|
2384
2650
|
def self.popen: (*untyped args) -> untyped
|
2385
2651
|
|
2386
2652
|
# <!--
|
2387
2653
|
# rdoc-file=io.c
|
2388
|
-
# - IO.foreach(
|
2389
|
-
# - IO.foreach(
|
2390
|
-
# - IO.foreach(
|
2391
|
-
# - IO.foreach(
|
2392
|
-
# -
|
2393
|
-
# -
|
2394
|
-
# -
|
2395
|
-
# - File.foreach(...) -> an_enumerator
|
2654
|
+
# - IO.foreach(path, sep = $/, **opts) {|line| block } -> nil
|
2655
|
+
# - IO.foreach(path, limit, **opts) {|line| block } -> nil
|
2656
|
+
# - IO.foreach(path, sep, limit, **opts) {|line| block } -> nil
|
2657
|
+
# - IO.foreach(command, sep = $/, **opts) {|line| block } -> nil
|
2658
|
+
# - IO.foreach(command, limit, **opts) {|line| block } -> nil
|
2659
|
+
# - IO.foreach(command, sep, limit, **opts) {|line| block } -> nil
|
2660
|
+
# - IO.foreach(...) -> an_enumerator
|
2396
2661
|
# -->
|
2397
|
-
#
|
2398
|
-
# separated by *sep*.
|
2662
|
+
# Calls the block with each successive line read from the stream.
|
2399
2663
|
#
|
2400
|
-
#
|
2664
|
+
# When called from class IO (but not subclasses of IO), this method has
|
2665
|
+
# potential security vulnerabilities if called with untrusted input; see
|
2666
|
+
# [Command Injection](rdoc-ref:command_injection.rdoc).
|
2401
2667
|
#
|
2402
|
-
#
|
2403
|
-
# class, a subprocess is created in the same way as Kernel#open, and its output
|
2404
|
-
# is returned. Consider to use File.foreach to disable the behavior of
|
2405
|
-
# subprocess invocation.
|
2668
|
+
# The first argument must be a string that is one of the following:
|
2406
2669
|
#
|
2407
|
-
#
|
2408
|
-
#
|
2670
|
+
# * Path: if `self` is a subclass of IO (File, for example), or if the string
|
2671
|
+
# *does* *not* start with the pipe character (`'|'`), the string is the path
|
2672
|
+
# to a file.
|
2673
|
+
# * Command: if `self` is the class IO, and if the string starts with the pipe
|
2674
|
+
# character, the rest of the string is a command to be executed as a
|
2675
|
+
# subprocess. This usage has potential security vulnerabilities if called
|
2676
|
+
# with untrusted input; see [Command
|
2677
|
+
# Injection](rdoc-ref:command_injection.rdoc).
|
2409
2678
|
#
|
2410
|
-
# *produces:*
|
2411
2679
|
#
|
2412
|
-
#
|
2413
|
-
#
|
2414
|
-
#
|
2415
|
-
#
|
2680
|
+
# With only argument `path` given, parses lines from the file at the given
|
2681
|
+
# `path`, as determined by the default line separator, and calls the block with
|
2682
|
+
# each successive line:
|
2683
|
+
#
|
2684
|
+
# File.foreach('t.txt') {|line| p line }
|
2685
|
+
#
|
2686
|
+
# Output: the same as above.
|
2687
|
+
#
|
2688
|
+
# For both forms, command and path, the remaining arguments are the same.
|
2689
|
+
#
|
2690
|
+
# With argument `sep` given, parses lines as determined by that line separator
|
2691
|
+
# (see [Line Separator](rdoc-ref:IO@Line+Separator)):
|
2692
|
+
#
|
2693
|
+
# File.foreach('t.txt', 'li') {|line| p line }
|
2694
|
+
#
|
2695
|
+
# Output:
|
2696
|
+
#
|
2697
|
+
# "First li"
|
2698
|
+
# "ne\nSecond li"
|
2699
|
+
# "ne\n\nThird li"
|
2700
|
+
# "ne\nFourth li"
|
2701
|
+
# "ne\n"
|
2702
|
+
#
|
2703
|
+
# Each paragraph:
|
2704
|
+
#
|
2705
|
+
# File.foreach('t.txt', '') {|paragraph| p paragraph }
|
2706
|
+
#
|
2707
|
+
# Output:
|
2708
|
+
#
|
2709
|
+
# "First line\nSecond line\n\n"
|
2710
|
+
# "Third line\nFourth line\n"
|
2711
|
+
#
|
2712
|
+
# With argument `limit` given, parses lines as determined by the default line
|
2713
|
+
# separator and the given line-length limit (see [Line
|
2714
|
+
# Limit](rdoc-ref:IO@Line+Limit)):
|
2715
|
+
#
|
2716
|
+
# File.foreach('t.txt', 7) {|line| p line }
|
2717
|
+
#
|
2718
|
+
# Output:
|
2719
|
+
#
|
2720
|
+
# "First l"
|
2721
|
+
# "ine\n"
|
2722
|
+
# "Second "
|
2723
|
+
# "line\n"
|
2724
|
+
# "\n"
|
2725
|
+
# "Third l"
|
2726
|
+
# "ine\n"
|
2727
|
+
# "Fourth l"
|
2728
|
+
# "line\n"
|
2729
|
+
#
|
2730
|
+
# With arguments `sep` and `limit` given, parses lines as determined by the
|
2731
|
+
# given line separator and the given line-length limit (see [Line Separator and
|
2732
|
+
# Line Limit](rdoc-ref:IO@Line+Separator+and+Line+Limit)):
|
2733
|
+
#
|
2734
|
+
# Optional keyword arguments `opts` specify:
|
2735
|
+
#
|
2736
|
+
# * [Open Options](rdoc-ref:IO@Open+Options).
|
2737
|
+
# * [Encoding options](rdoc-ref:encodings.rdoc@Encoding+Options).
|
2738
|
+
# * [Line Options](rdoc-ref:IO@Line+Options).
|
2416
2739
|
#
|
2417
|
-
#
|
2418
|
-
#
|
2419
|
-
# about open_args.
|
2740
|
+
#
|
2741
|
+
# Returns an Enumerator if no block is given.
|
2420
2742
|
#
|
2421
2743
|
def self.foreach: (string | _ToPath path, ?String sep, ?Integer limit, ?external_encoding: String external_encoding, ?internal_encoding: String internal_encoding, ?encoding: String encoding, ?textmode: untyped textmode, ?binmode: untyped binmode, ?autoclose: untyped autoclose, ?mode: String mode, ?chomp: boolish) { (String line) -> void } -> nil
|
2422
2744
|
| (string | _ToPath path, ?String sep, ?Integer limit, ?external_encoding: String external_encoding, ?internal_encoding: String internal_encoding, ?encoding: String encoding, ?textmode: untyped textmode, ?binmode: untyped binmode, ?autoclose: untyped autoclose, ?mode: String mode, ?chomp: boolish) -> ::Enumerator[String, nil]
|
2423
2745
|
|
2424
2746
|
# <!--
|
2425
2747
|
# rdoc-file=io.c
|
2426
|
-
# - IO.pipe
|
2427
|
-
# - IO.pipe(
|
2428
|
-
# - IO.pipe(
|
2429
|
-
# - IO.pipe(
|
2430
|
-
# - IO.pipe(
|
2748
|
+
# - IO.pipe(**opts) -> [read_io, write_io]
|
2749
|
+
# - IO.pipe(enc, **opts) -> [read_io, write_io]
|
2750
|
+
# - IO.pipe(ext_enc, int_enc, **opts) -> [read_io, write_io]
|
2751
|
+
# - IO.pipe(**opts) {|read_io, write_io] ...} -> object
|
2752
|
+
# - IO.pipe(enc, **opts) {|read_io, write_io] ...} -> object
|
2753
|
+
# - IO.pipe(ext_enc, int_enc, **opts) {|read_io, write_io] ...} -> object
|
2431
2754
|
# -->
|
2432
|
-
# Creates a pair of pipe endpoints
|
2433
|
-
#
|
2755
|
+
# Creates a pair of pipe endpoints, `read_io` and `write_io`, connected to each
|
2756
|
+
# other.
|
2434
2757
|
#
|
2435
|
-
# If
|
2436
|
-
# *read_io* and *write_io* are sent to the block as arguments. If read_io and
|
2437
|
-
# write_io are not closed when the block exits, they are closed. i.e. closing
|
2438
|
-
# read_io and/or write_io doesn't cause an error.
|
2758
|
+
# If argument `enc_string` is given, it must be a string containing one of:
|
2439
2759
|
#
|
2440
|
-
#
|
2760
|
+
# * The name of the encoding to be used as the external encoding.
|
2761
|
+
# * The colon-separated names of two encodings to be used as the external and
|
2762
|
+
# internal encodings.
|
2763
|
+
#
|
2764
|
+
#
|
2765
|
+
# If argument `int_enc` is given, it must be an Encoding object or encoding name
|
2766
|
+
# string that specifies the internal encoding to be used; if argument `ext_enc`
|
2767
|
+
# is also given, it must be an Encoding object or encoding name string that
|
2768
|
+
# specifies the external encoding to be used.
|
2769
|
+
#
|
2770
|
+
# The string read from `read_io` is tagged with the external encoding; if an
|
2771
|
+
# internal encoding is also specified, the string is converted to, and tagged
|
2772
|
+
# with, that encoding.
|
2773
|
+
#
|
2774
|
+
# If any encoding is specified, optional hash arguments specify the conversion
|
2775
|
+
# option.
|
2776
|
+
#
|
2777
|
+
# Optional keyword arguments `opts` specify:
|
2778
|
+
#
|
2779
|
+
# * [Open Options](rdoc-ref:IO@Open+Options).
|
2780
|
+
# * [Encoding Options](rdoc-ref:encodings.rdoc@Encoding+Options).
|
2781
|
+
#
|
2782
|
+
#
|
2783
|
+
# With no block given, returns the two endpoints in an array:
|
2784
|
+
#
|
2785
|
+
# IO.pipe # => [#<IO:fd 4>, #<IO:fd 5>]
|
2786
|
+
#
|
2787
|
+
# With a block given, calls the block with the two endpoints; closes both
|
2788
|
+
# endpoints and returns the value of the block:
|
2789
|
+
#
|
2790
|
+
# IO.pipe {|read_io, write_io| p read_io; p write_io }
|
2791
|
+
#
|
2792
|
+
# Output:
|
2793
|
+
#
|
2794
|
+
# #<IO:fd 6>
|
2795
|
+
# #<IO:fd 7>
|
2441
2796
|
#
|
2442
|
-
#
|
2443
|
-
# argument, read string from pipe is tagged with the encoding specified. If the
|
2444
|
-
# argument is a colon separated two encoding names "A:B", the read string is
|
2445
|
-
# converted from encoding A (external encoding) to encoding B (internal
|
2446
|
-
# encoding), then tagged with B. If two optional arguments are specified, those
|
2447
|
-
# must be encoding objects or encoding names, and the first one is the external
|
2448
|
-
# encoding, and the second one is the internal encoding. If the external
|
2449
|
-
# encoding and the internal encoding is specified, optional hash argument
|
2450
|
-
# specify the conversion option.
|
2797
|
+
# Not available on all platforms.
|
2451
2798
|
#
|
2452
2799
|
# In the example below, the two processes close the ends of the pipe that they
|
2453
2800
|
# are not using. This is not just a cosmetic nicety. The read end of a pipe will
|
2454
2801
|
# not generate an end of file condition if there are any writers with the pipe
|
2455
2802
|
# still open. In the case of the parent process, the `rd.read` will never return
|
2456
|
-
# if it does not first issue a `wr.close
|
2803
|
+
# if it does not first issue a `wr.close`:
|
2457
2804
|
#
|
2458
2805
|
# rd, wr = IO.pipe
|
2459
2806
|
#
|
@@ -2464,7 +2811,7 @@ class IO < Object
|
|
2464
2811
|
# Process.wait
|
2465
2812
|
# else
|
2466
2813
|
# rd.close
|
2467
|
-
# puts
|
2814
|
+
# puts 'Sending message to parent'
|
2468
2815
|
# wr.write "Hi Dad"
|
2469
2816
|
# wr.close
|
2470
2817
|
# end
|
@@ -2479,113 +2826,168 @@ class IO < Object
|
|
2479
2826
|
|
2480
2827
|
# <!--
|
2481
2828
|
# rdoc-file=io.c
|
2482
|
-
# - IO.read(
|
2483
|
-
# -
|
2829
|
+
# - IO.read(command, length = nil, offset = 0, **opts) -> string or nil
|
2830
|
+
# - IO.read(path, length = nil, offset = 0, **opts) -> string or nil
|
2484
2831
|
# -->
|
2485
|
-
# Opens the
|
2486
|
-
#
|
2487
|
-
# before returning.
|
2832
|
+
# Opens the stream, reads and returns some or all of its content, and closes the
|
2833
|
+
# stream; returns `nil` if no bytes were read.
|
2488
2834
|
#
|
2489
|
-
#
|
2490
|
-
#
|
2491
|
-
#
|
2492
|
-
# invocation.
|
2835
|
+
# When called from class IO (but not subclasses of IO), this method has
|
2836
|
+
# potential security vulnerabilities if called with untrusted input; see
|
2837
|
+
# [Command Injection](rdoc-ref:command_injection.rdoc).
|
2493
2838
|
#
|
2494
|
-
#
|
2839
|
+
# The first argument must be a string; its meaning depends on whether it starts
|
2840
|
+
# with the pipe character (`'|'`):
|
2495
2841
|
#
|
2496
|
-
#
|
2842
|
+
# * If so (and if `self` is IO), the rest of the string is a command to be
|
2843
|
+
# executed as a subprocess.
|
2844
|
+
# * Otherwise, the string is the path to a file.
|
2497
2845
|
#
|
2498
|
-
# :encoding
|
2499
|
-
# : string or encoding
|
2500
2846
|
#
|
2501
|
-
#
|
2502
|
-
#
|
2847
|
+
# With only argument `command` given, executes the command in a shell, returns
|
2848
|
+
# its entire $stdout:
|
2503
2849
|
#
|
2504
|
-
#
|
2505
|
-
#
|
2850
|
+
# IO.read('| cat t.txt')
|
2851
|
+
# # => "First line\nSecond line\n\nThird line\nFourth line\n"
|
2506
2852
|
#
|
2507
|
-
#
|
2508
|
-
#
|
2509
|
-
# modes.
|
2853
|
+
# With only argument `path` given, reads in text mode and returns the entire
|
2854
|
+
# content of the file at the given path:
|
2510
2855
|
#
|
2511
|
-
#
|
2512
|
-
#
|
2856
|
+
# IO.read('t.txt')
|
2857
|
+
# # => "First line\nSecond line\n\nThird line\nFourth line\n"
|
2513
2858
|
#
|
2514
|
-
#
|
2515
|
-
#
|
2859
|
+
# On Windows, text mode can terminate reading and leave bytes in the file unread
|
2860
|
+
# when encountering certain special bytes. Consider using IO.binread if all
|
2861
|
+
# bytes in the file should be read.
|
2516
2862
|
#
|
2863
|
+
# For both forms, command and path, the remaining arguments are the same.
|
2517
2864
|
#
|
2518
|
-
#
|
2865
|
+
# With argument `length`, returns `length` bytes if available:
|
2866
|
+
#
|
2867
|
+
# IO.read('t.txt', 7) # => "First l"
|
2868
|
+
# IO.read('t.txt', 700)
|
2869
|
+
# # => "First line\r\nSecond line\r\n\r\nFourth line\r\nFifth line\r\n"
|
2870
|
+
#
|
2871
|
+
# With arguments `length` and `offset`, returns `length` bytes if available,
|
2872
|
+
# beginning at the given `offset`:
|
2519
2873
|
#
|
2520
|
-
#
|
2521
|
-
#
|
2522
|
-
#
|
2523
|
-
#
|
2524
|
-
#
|
2874
|
+
# IO.read('t.txt', 10, 2) # => "rst line\nS"
|
2875
|
+
# IO.read('t.txt', 10, 200) # => nil
|
2876
|
+
#
|
2877
|
+
# Optional keyword arguments `opts` specify:
|
2878
|
+
#
|
2879
|
+
# * [Open Options](rdoc-ref:IO@Open+Options).
|
2880
|
+
# * [Encoding options](rdoc-ref:encodings.rdoc@Encoding+Options).
|
2525
2881
|
#
|
2526
2882
|
def self.read: (String name, ?Integer length, ?Integer offset, ?external_encoding: String external_encoding, ?internal_encoding: String internal_encoding, ?encoding: String encoding, ?textmode: untyped textmode, ?binmode: untyped binmode, ?autoclose: untyped autoclose, ?mode: String mode) -> String
|
2527
2883
|
|
2528
2884
|
# <!--
|
2529
2885
|
# rdoc-file=io.c
|
2530
|
-
# - IO.readlines(
|
2531
|
-
# - IO.readlines(
|
2532
|
-
# - IO.readlines(
|
2533
|
-
# -
|
2534
|
-
# -
|
2535
|
-
# -
|
2886
|
+
# - IO.readlines(command, sep = $/, **opts) -> array
|
2887
|
+
# - IO.readlines(command, limit, **opts) -> array
|
2888
|
+
# - IO.readlines(command, sep, limit, **opts) -> array
|
2889
|
+
# - IO.readlines(path, sep = $/, **opts) -> array
|
2890
|
+
# - IO.readlines(path, limit, **opts) -> array
|
2891
|
+
# - IO.readlines(path, sep, limit, **opts) -> array
|
2536
2892
|
# -->
|
2537
|
-
#
|
2538
|
-
#
|
2893
|
+
# Returns an array of all lines read from the stream.
|
2894
|
+
#
|
2895
|
+
# When called from class IO (but not subclasses of IO), this method has
|
2896
|
+
# potential security vulnerabilities if called with untrusted input; see
|
2897
|
+
# [Command Injection](rdoc-ref:command_injection.rdoc).
|
2898
|
+
#
|
2899
|
+
# The first argument must be a string; its meaning depends on whether it starts
|
2900
|
+
# with the pipe character (`'|'`):
|
2539
2901
|
#
|
2540
|
-
# If `
|
2541
|
-
#
|
2542
|
-
#
|
2543
|
-
# subprocess invocation.
|
2902
|
+
# * If so (and if `self` is IO), the rest of the string is a command to be
|
2903
|
+
# executed as a subprocess.
|
2904
|
+
# * Otherwise, the string is the path to a file.
|
2544
2905
|
#
|
2545
|
-
# a = File.readlines("testfile")
|
2546
|
-
# a[0] #=> "This is line one\n"
|
2547
2906
|
#
|
2548
|
-
#
|
2549
|
-
#
|
2907
|
+
# With only argument `command` given, executes the command in a shell, parses
|
2908
|
+
# its $stdout into lines, as determined by the default line separator, and
|
2909
|
+
# returns those lines in an array:
|
2550
2910
|
#
|
2551
|
-
# IO.readlines(
|
2911
|
+
# IO.readlines('| cat t.txt')
|
2912
|
+
# # => ["First line\n", "Second line\n", "\n", "Third line\n", "Fourth line\n"]
|
2552
2913
|
#
|
2553
|
-
#
|
2914
|
+
# With only argument `path` given, parses lines from the file at the given
|
2915
|
+
# `path`, as determined by the default line separator, and returns those lines
|
2916
|
+
# in an array:
|
2554
2917
|
#
|
2555
|
-
#
|
2918
|
+
# IO.readlines('t.txt')
|
2919
|
+
# # => ["First line\n", "Second line\n", "\n", "Third line\n", "Fourth line\n"]
|
2556
2920
|
#
|
2557
|
-
#
|
2921
|
+
# For both forms, command and path, the remaining arguments are the same.
|
2558
2922
|
#
|
2559
|
-
#
|
2560
|
-
#
|
2561
|
-
# and `\r\n` will be removed from the end of each line.
|
2923
|
+
# With argument `sep` given, parses lines as determined by that line separator
|
2924
|
+
# (see [Line Separator](rdoc-ref:IO@Line+Separator)):
|
2562
2925
|
#
|
2926
|
+
# # Ordinary separator.
|
2927
|
+
# IO.readlines('t.txt', 'li')
|
2928
|
+
# # =>["First li", "ne\nSecond li", "ne\n\nThird li", "ne\nFourth li", "ne\n"]
|
2929
|
+
# # Get-paragraphs separator.
|
2930
|
+
# IO.readlines('t.txt', '')
|
2931
|
+
# # => ["First line\nSecond line\n\n", "Third line\nFourth line\n"]
|
2932
|
+
# # Get-all separator.
|
2933
|
+
# IO.readlines('t.txt', nil)
|
2934
|
+
# # => ["First line\nSecond line\n\nThird line\nFourth line\n"]
|
2563
2935
|
#
|
2564
|
-
#
|
2936
|
+
# With argument `limit` given, parses lines as determined by the default line
|
2937
|
+
# separator and the given line-length limit (see [Line
|
2938
|
+
# Limit](rdoc-ref:IO@Line+Limit)):
|
2939
|
+
#
|
2940
|
+
# IO.readlines('t.txt', 7)
|
2941
|
+
# # => ["First l", "ine\n", "Second ", "line\n", "\n", "Third l", "ine\n", "Fourth ", "line\n"]
|
2942
|
+
#
|
2943
|
+
# With arguments `sep` and `limit` given, parses lines as determined by the
|
2944
|
+
# given line separator and the given line-length limit (see [Line Separator and
|
2945
|
+
# Line Limit](rdoc-ref:IO@Line+Separator+and+Line+Limit)):
|
2946
|
+
#
|
2947
|
+
# Optional keyword arguments `opts` specify:
|
2948
|
+
#
|
2949
|
+
# * [Open Options](rdoc-ref:IO@Open+Options).
|
2950
|
+
# * [Encoding options](rdoc-ref:encodings.rdoc@Encoding+Options).
|
2951
|
+
# * [Line Options](rdoc-ref:IO@Line+Options).
|
2565
2952
|
#
|
2566
2953
|
def self.readlines: (String | _ToPath name, ?String sep, ?Integer limit, ?external_encoding: String external_encoding, ?internal_encoding: String internal_encoding, ?encoding: String encoding, ?textmode: untyped textmode, ?binmode: untyped binmode, ?autoclose: untyped autoclose, ?mode: String mode, ?chomp: boolish) -> ::Array[String]
|
2567
2954
|
|
2568
2955
|
# <!--
|
2569
2956
|
# rdoc-file=io.c
|
2570
|
-
# - IO.select(
|
2957
|
+
# - IO.select(read_ios, write_ios = [], error_ios = [], timeout = nil) -> array or nil
|
2571
2958
|
# -->
|
2572
|
-
#
|
2573
|
-
# until one or more of
|
2574
|
-
#
|
2575
|
-
#
|
2576
|
-
#
|
2959
|
+
# Invokes system call [select(2)](https://linux.die.net/man/2/select), which
|
2960
|
+
# monitors multiple file descriptors, waiting until one or more of the file
|
2961
|
+
# descriptors becomes ready for some class of I/O operation.
|
2962
|
+
#
|
2963
|
+
# Not implemented on all platforms.
|
2964
|
+
#
|
2965
|
+
# Each of the arguments `read_ios`, `write_ios`, and `error_ios` is an array of
|
2966
|
+
# IO objects.
|
2967
|
+
#
|
2968
|
+
# Argument `timeout` is an integer timeout interval in seconds.
|
2969
|
+
#
|
2970
|
+
# The method monitors the IO objects given in all three arrays, waiting for some
|
2971
|
+
# to be ready; returns a 3-element array whose elements are:
|
2972
|
+
#
|
2973
|
+
# * An array of the objects in `read_ios` that are ready for reading.
|
2974
|
+
# * An array of the objects in `write_ios` that are ready for writing.
|
2975
|
+
# * An array of the objects in `error_ios` have pending exceptions.
|
2976
|
+
#
|
2977
|
+
#
|
2978
|
+
# If no object becomes ready within the given `timeout`, `nil` is returned.
|
2577
2979
|
#
|
2578
2980
|
# IO.select peeks the buffer of IO objects for testing readability. If the IO
|
2579
2981
|
# buffer is not empty, IO.select immediately notifies readability. This "peek"
|
2580
2982
|
# only happens for IO objects. It does not happen for IO-like objects such as
|
2581
2983
|
# OpenSSL::SSL::SSLSocket.
|
2582
2984
|
#
|
2583
|
-
# The best way to use IO.select is invoking it after
|
2584
|
-
# #read_nonblock, #write_nonblock, etc. The methods raise an exception which
|
2585
|
-
# extended by IO::WaitReadable or IO::WaitWritable. The modules notify how
|
2586
|
-
# caller should wait with IO.select. If IO::WaitReadable is raised, the
|
2587
|
-
# should wait for reading. If IO::WaitWritable is raised, the caller
|
2588
|
-
# wait for writing.
|
2985
|
+
# The best way to use IO.select is invoking it after non-blocking methods such
|
2986
|
+
# as #read_nonblock, #write_nonblock, etc. The methods raise an exception which
|
2987
|
+
# is extended by IO::WaitReadable or IO::WaitWritable. The modules notify how
|
2988
|
+
# the caller should wait with IO.select. If IO::WaitReadable is raised, the
|
2989
|
+
# caller should wait for reading. If IO::WaitWritable is raised, the caller
|
2990
|
+
# should wait for writing.
|
2589
2991
|
#
|
2590
2992
|
# So, blocking read (#readpartial) can be emulated using #read_nonblock and
|
2591
2993
|
# IO.select as follows:
|
@@ -2600,7 +3002,7 @@ class IO < Object
|
|
2600
3002
|
# retry
|
2601
3003
|
# end
|
2602
3004
|
#
|
2603
|
-
# Especially, the combination of
|
3005
|
+
# Especially, the combination of non-blocking methods and IO.select is preferred
|
2604
3006
|
# for IO like objects such as OpenSSL::SSL::SSLSocket. It has #to_io method to
|
2605
3007
|
# return underlying IO object. IO.select calls #to_io to obtain the file
|
2606
3008
|
# descriptor to wait.
|
@@ -2626,13 +3028,13 @@ class IO < Object
|
|
2626
3028
|
# blocking. So, the caller should wait for ready for writability as above
|
2627
3029
|
# example.
|
2628
3030
|
#
|
2629
|
-
# The combination of
|
3031
|
+
# The combination of non-blocking methods and IO.select is also useful for
|
2630
3032
|
# streams such as tty, pipe socket socket when multiple processes read from a
|
2631
3033
|
# stream.
|
2632
3034
|
#
|
2633
3035
|
# Finally, Linux kernel developers don't guarantee that readability of select(2)
|
2634
|
-
# means readability of following read(2) even for a single process
|
2635
|
-
# select(2)
|
3036
|
+
# means readability of following read(2) even for a single process; see
|
3037
|
+
# [select(2)](https://linux.die.net/man/2/select)
|
2636
3038
|
#
|
2637
3039
|
# Invoking IO.select before IO#readpartial works well as usual. However it is
|
2638
3040
|
# not the best way to use IO.select.
|
@@ -2659,18 +3061,7 @@ class IO < Object
|
|
2659
3061
|
# string = string.byteslice(written..-1)
|
2660
3062
|
# end
|
2661
3063
|
#
|
2662
|
-
#
|
2663
|
-
# read_array
|
2664
|
-
# : an array of IO objects that wait until ready for read
|
2665
|
-
# write_array
|
2666
|
-
# : an array of IO objects that wait until ready for write
|
2667
|
-
# error_array
|
2668
|
-
# : an array of IO objects that wait for exceptions
|
2669
|
-
# timeout
|
2670
|
-
# : a numeric value in second
|
2671
|
-
#
|
2672
|
-
#
|
2673
|
-
# ### Example
|
3064
|
+
# Example:
|
2674
3065
|
#
|
2675
3066
|
# rp, wp = IO.pipe
|
2676
3067
|
# mesg = "ping "
|
@@ -2692,7 +3083,7 @@ class IO < Object
|
|
2692
3083
|
# end
|
2693
3084
|
# }
|
2694
3085
|
#
|
2695
|
-
#
|
3086
|
+
# Output:
|
2696
3087
|
#
|
2697
3088
|
# ping pong
|
2698
3089
|
# ping pong
|
@@ -2705,11 +3096,17 @@ class IO < Object
|
|
2705
3096
|
|
2706
3097
|
# <!--
|
2707
3098
|
# rdoc-file=io.c
|
2708
|
-
# - IO.sysopen(path,
|
3099
|
+
# - IO.sysopen(path, mode = 'r', perm = 0666) -> integer
|
2709
3100
|
# -->
|
2710
|
-
# Opens the given path
|
3101
|
+
# Opens the file at the given path with the given mode and permissions; returns
|
3102
|
+
# the integer file descriptor.
|
3103
|
+
#
|
3104
|
+
# If the file is to be readable, it must exist; if the file is to be writable
|
3105
|
+
# and does not exist, it is created with the given permissions:
|
2711
3106
|
#
|
2712
|
-
#
|
3107
|
+
# File.write('t.tmp', '') # => 0
|
3108
|
+
# IO.sysopen('t.tmp') # => 8
|
3109
|
+
# IO.sysopen('t.tmp', 'w') # => 9
|
2713
3110
|
#
|
2714
3111
|
def self.sysopen: (String path, ?String mode, ?String perm) -> Integer
|
2715
3112
|
|
@@ -2728,96 +3125,87 @@ class IO < Object
|
|
2728
3125
|
|
2729
3126
|
# <!--
|
2730
3127
|
# rdoc-file=io.c
|
2731
|
-
# - IO.write(
|
2732
|
-
# - IO.write(
|
2733
|
-
# - File.write(name, string [, offset]) -> integer
|
2734
|
-
# - File.write(name, string [, offset] [, opt]) -> integer
|
3128
|
+
# - IO.write(command, data, **opts) -> integer
|
3129
|
+
# - IO.write(path, data, offset = 0, **opts) -> integer
|
2735
3130
|
# -->
|
2736
|
-
# Opens the
|
2737
|
-
# returns the
|
2738
|
-
# returning. If *offset* is not given in write mode, the file is truncated.
|
2739
|
-
# Otherwise, it is not truncated.
|
3131
|
+
# Opens the stream, writes the given `data` to it, and closes the stream;
|
3132
|
+
# returns the number of bytes written.
|
2740
3133
|
#
|
2741
|
-
#
|
2742
|
-
#
|
2743
|
-
#
|
2744
|
-
# invocation.
|
3134
|
+
# When called from class IO (but not subclasses of IO), this method has
|
3135
|
+
# potential security vulnerabilities if called with untrusted input; see
|
3136
|
+
# [Command Injection](rdoc-ref:command_injection.rdoc).
|
2745
3137
|
#
|
2746
|
-
#
|
2747
|
-
#
|
2748
|
-
# File.write("testfile", "0123456789") #=> 10
|
2749
|
-
# # File would now read: "0123456789"
|
2750
|
-
# IO.write("|tr a-z A-Z", "abc") #=> 3
|
2751
|
-
# # Prints "ABC" to the standard output
|
3138
|
+
# The first argument must be a string; its meaning depends on whether it starts
|
3139
|
+
# with the pipe character (`'|'`):
|
2752
3140
|
#
|
2753
|
-
# If
|
2754
|
-
#
|
3141
|
+
# * If so (and if `self` is IO), the rest of the string is a command to be
|
3142
|
+
# executed as a subprocess.
|
3143
|
+
# * Otherwise, the string is the path to a file.
|
2755
3144
|
#
|
2756
|
-
# :encoding
|
2757
|
-
# : string or encoding
|
2758
3145
|
#
|
2759
|
-
#
|
2760
|
-
#
|
3146
|
+
# With argument `command` given, executes the command in a shell, passes `data`
|
3147
|
+
# through standard input, writes its output to $stdout, and returns the length
|
3148
|
+
# of the given `data`:
|
2761
3149
|
#
|
2762
|
-
#
|
2763
|
-
# : string or integer
|
3150
|
+
# IO.write('| cat', 'Hello World!') # => 12
|
2764
3151
|
#
|
2765
|
-
#
|
2766
|
-
#
|
2767
|
-
#
|
3152
|
+
# Output:
|
3153
|
+
#
|
3154
|
+
# Hello World!
|
3155
|
+
#
|
3156
|
+
# With argument `path` given, writes the given `data` to the file at that path:
|
3157
|
+
#
|
3158
|
+
# IO.write('t.tmp', 'abc') # => 3
|
3159
|
+
# File.read('t.tmp') # => "abc"
|
2768
3160
|
#
|
2769
|
-
# :
|
2770
|
-
# : integer
|
3161
|
+
# If `offset` is zero (the default), the file is overwritten:
|
2771
3162
|
#
|
2772
|
-
#
|
3163
|
+
# IO.write('t.tmp', 'A') # => 1
|
3164
|
+
# File.read('t.tmp') # => "A"
|
2773
3165
|
#
|
2774
|
-
# :
|
2775
|
-
# : array
|
3166
|
+
# If `offset` in within the file content, the file is partly overwritten:
|
2776
3167
|
#
|
2777
|
-
#
|
2778
|
-
#
|
3168
|
+
# IO.write('t.tmp', 'abcdef') # => 3
|
3169
|
+
# File.read('t.tmp') # => "abcdef"
|
3170
|
+
# # Offset within content.
|
3171
|
+
# IO.write('t.tmp', '012', 2) # => 3
|
3172
|
+
# File.read('t.tmp') # => "ab012f"
|
2779
3173
|
#
|
3174
|
+
# If `offset` is outside the file content, the file is padded with null
|
3175
|
+
# characters `"\u0000"`:
|
2780
3176
|
#
|
2781
|
-
#
|
3177
|
+
# IO.write('t.tmp', 'xyz', 10) # => 3
|
3178
|
+
# File.read('t.tmp') # => "ab012f\u0000\u0000\u0000\u0000xyz"
|
3179
|
+
#
|
3180
|
+
# Optional keyword arguments `opts` specify:
|
3181
|
+
#
|
3182
|
+
# * [Open Options](rdoc-ref:IO@Open+Options).
|
3183
|
+
# * [Encoding options](rdoc-ref:encodings.rdoc@Encoding+Options).
|
2782
3184
|
#
|
2783
3185
|
def self.write: (String name, _ToS arg0, ?Integer offset, ?external_encoding: String external_encoding, ?internal_encoding: String internal_encoding, ?encoding: String encoding, ?textmode: untyped textmode, ?binmode: untyped binmode, ?autoclose: untyped autoclose, ?mode: String mode) -> Integer
|
2784
3186
|
|
2785
3187
|
# <!--
|
2786
3188
|
# rdoc-file=io.c
|
2787
|
-
# - IO.for_fd(fd, mode
|
3189
|
+
# - IO.for_fd(fd, mode = 'r', **opts) -> io
|
2788
3190
|
# -->
|
2789
3191
|
# Synonym for IO.new.
|
2790
3192
|
#
|
2791
|
-
|
3193
|
+
alias self.for_fd self.new
|
2792
3194
|
|
2793
3195
|
# <!--
|
2794
3196
|
# rdoc-file=io.c
|
2795
|
-
# - IO.open(fd, mode=
|
2796
|
-
# - IO.open(fd, mode=
|
3197
|
+
# - IO.open(fd, mode = 'r', **opts) -> io
|
3198
|
+
# - IO.open(fd, mode = 'r', **opts) {|io| ... } -> object
|
2797
3199
|
# -->
|
2798
|
-
#
|
2799
|
-
# code block is given, it will be passed `io` as an argument, and the IO object
|
2800
|
-
# will automatically be closed when the block terminates. In this instance,
|
2801
|
-
# IO.open returns the value of the block.
|
3200
|
+
# Creates a new IO object, via IO.new with the given arguments.
|
2802
3201
|
#
|
2803
|
-
#
|
2804
|
-
#
|
2805
|
-
alias self.open self.for_fd
|
2806
|
-
|
2807
|
-
# <!--
|
2808
|
-
# rdoc-file=io.c
|
2809
|
-
# - IO.open(fd, mode="r" [, opt]) -> io
|
2810
|
-
# - IO.open(fd, mode="r" [, opt]) {|io| block } -> obj
|
2811
|
-
# -->
|
2812
|
-
# With no associated block, IO.open is a synonym for IO.new. If the optional
|
2813
|
-
# code block is given, it will be passed `io` as an argument, and the IO object
|
2814
|
-
# will automatically be closed when the block terminates. In this instance,
|
2815
|
-
# IO.open returns the value of the block.
|
3202
|
+
# With no block given, returns the IO object.
|
2816
3203
|
#
|
2817
|
-
#
|
3204
|
+
# With a block given, calls the block with the IO object and returns the block's
|
3205
|
+
# value.
|
2818
3206
|
#
|
2819
|
-
def self.open:
|
2820
|
-
|
|
3207
|
+
def self.open: (int fd, ?string | int mode, ?path: string?, **untyped opts) -> instance
|
3208
|
+
| [A] (int fd, ?string | int mode, ?path: string?, **untyped opts) { (instance) -> A } -> A
|
2821
3209
|
|
2822
3210
|
def bytes: () { (Integer arg0) -> untyped } -> self
|
2823
3211
|
| () -> ::Enumerator[Integer, self]
|
@@ -2829,37 +3217,118 @@ class IO < Object
|
|
2829
3217
|
| () -> ::Enumerator[Integer, self]
|
2830
3218
|
|
2831
3219
|
# <!-- rdoc-file=io.c -->
|
2832
|
-
#
|
2833
|
-
#
|
3220
|
+
# Calls the block with each remaining line read from the stream; returns `self`.
|
3221
|
+
# Does nothing if already at end-of-stream; See [Line IO](rdoc-ref:IO@Line+IO).
|
2834
3222
|
#
|
2835
|
-
#
|
3223
|
+
# With no arguments given, reads lines as determined by line separator `$/`:
|
2836
3224
|
#
|
2837
|
-
# f = File.new(
|
2838
|
-
# f.
|
3225
|
+
# f = File.new('t.txt')
|
3226
|
+
# f.each_line {|line| p line }
|
3227
|
+
# f.each_line {|line| fail 'Cannot happen' }
|
3228
|
+
# f.close
|
2839
3229
|
#
|
2840
|
-
#
|
3230
|
+
# Output:
|
3231
|
+
#
|
3232
|
+
# "First line\n"
|
3233
|
+
# "Second line\n"
|
3234
|
+
# "\n"
|
3235
|
+
# "Fourth line\n"
|
3236
|
+
# "Fifth line\n"
|
3237
|
+
#
|
3238
|
+
# With only string argument `sep` given, reads lines as determined by line
|
3239
|
+
# separator `sep`; see [Line Separator](rdoc-ref:IO@Line+Separator):
|
3240
|
+
#
|
3241
|
+
# f = File.new('t.txt')
|
3242
|
+
# f.each_line('li') {|line| p line }
|
3243
|
+
# f.close
|
3244
|
+
#
|
3245
|
+
# Output:
|
2841
3246
|
#
|
2842
|
-
#
|
2843
|
-
#
|
2844
|
-
#
|
2845
|
-
#
|
3247
|
+
# "First li"
|
3248
|
+
# "ne\nSecond li"
|
3249
|
+
# "ne\n\nFourth li"
|
3250
|
+
# "ne\nFifth li"
|
3251
|
+
# "ne\n"
|
2846
3252
|
#
|
2847
|
-
#
|
3253
|
+
# The two special values for `sep` are honored:
|
3254
|
+
#
|
3255
|
+
# f = File.new('t.txt')
|
3256
|
+
# # Get all into one string.
|
3257
|
+
# f.each_line(nil) {|line| p line }
|
3258
|
+
# f.close
|
3259
|
+
#
|
3260
|
+
# Output:
|
3261
|
+
#
|
3262
|
+
# "First line\nSecond line\n\nFourth line\nFifth line\n"
|
3263
|
+
#
|
3264
|
+
# f.rewind
|
3265
|
+
# # Get paragraphs (up to two line separators).
|
3266
|
+
# f.each_line('') {|line| p line }
|
3267
|
+
#
|
3268
|
+
# Output:
|
3269
|
+
#
|
3270
|
+
# "First line\nSecond line\n\n"
|
3271
|
+
# "Fourth line\nFifth line\n"
|
3272
|
+
#
|
3273
|
+
# With only integer argument `limit` given, limits the number of bytes in each
|
3274
|
+
# line; see [Line Limit](rdoc-ref:IO@Line+Limit):
|
3275
|
+
#
|
3276
|
+
# f = File.new('t.txt')
|
3277
|
+
# f.each_line(8) {|line| p line }
|
3278
|
+
# f.close
|
3279
|
+
#
|
3280
|
+
# Output:
|
3281
|
+
#
|
3282
|
+
# "First li"
|
3283
|
+
# "ne\n"
|
3284
|
+
# "Second l"
|
3285
|
+
# "ine\n"
|
3286
|
+
# "\n"
|
3287
|
+
# "Fourth l"
|
3288
|
+
# "ine\n"
|
3289
|
+
# "Fifth li"
|
3290
|
+
# "ne\n"
|
3291
|
+
#
|
3292
|
+
# With arguments `sep` and `limit` given, combines the two behaviors:
|
3293
|
+
#
|
3294
|
+
# * Calls with the next line as determined by line separator `sep`.
|
3295
|
+
# * But returns no more bytes than are allowed by the limit.
|
3296
|
+
#
|
3297
|
+
#
|
3298
|
+
# Optional keyword argument `chomp` specifies whether line separators are to be
|
3299
|
+
# omitted:
|
3300
|
+
#
|
3301
|
+
# f = File.new('t.txt')
|
3302
|
+
# f.each_line(chomp: true) {|line| p line }
|
3303
|
+
# f.close
|
3304
|
+
#
|
3305
|
+
# Output:
|
3306
|
+
#
|
3307
|
+
# "First line"
|
3308
|
+
# "Second line"
|
3309
|
+
# ""
|
3310
|
+
# "Fourth line"
|
3311
|
+
# "Fifth line"
|
3312
|
+
#
|
3313
|
+
# Returns an Enumerator if no block is given.
|
3314
|
+
#
|
3315
|
+
# IO#each is an alias for IO#each_line.
|
2848
3316
|
#
|
2849
3317
|
def each_line: (?String sep, ?Integer limit) { (String arg0) -> untyped } -> self
|
2850
3318
|
| (?String sep, ?Integer limit) -> ::Enumerator[String, self]
|
2851
3319
|
|
2852
3320
|
# <!-- rdoc-file=io.c -->
|
2853
3321
|
# Returns `true` if the stream is positioned at its end, `false` otherwise; see
|
2854
|
-
# [Position](
|
3322
|
+
# [Position](rdoc-ref:IO@Position):
|
2855
3323
|
#
|
2856
3324
|
# f = File.open('t.txt')
|
2857
3325
|
# f.eof # => false
|
2858
3326
|
# f.seek(0, :END) # => 0
|
2859
3327
|
# f.eof # => true
|
3328
|
+
# f.close
|
2860
3329
|
#
|
2861
3330
|
# Raises an exception unless the stream is opened for reading; see
|
2862
|
-
# [Mode](
|
3331
|
+
# [Mode](rdoc-ref:File@Access+Modes).
|
2863
3332
|
#
|
2864
3333
|
# If `self` is a stream such as pipe or socket, this method blocks until the
|
2865
3334
|
# other end sends some data or closes it:
|
@@ -2879,7 +3348,7 @@ class IO < Object
|
|
2879
3348
|
# not behave as you intend with IO#eof?, unless you call IO#rewind first (which
|
2880
3349
|
# is not available for some streams).
|
2881
3350
|
#
|
2882
|
-
#
|
3351
|
+
# IO#eof? is an alias for IO#eof.
|
2883
3352
|
#
|
2884
3353
|
def eof?: () -> bool
|
2885
3354
|
|
@@ -2893,6 +3362,7 @@ class IO < Object
|
|
2893
3362
|
# $stdout.fileno # => 1
|
2894
3363
|
# $stderr.fileno # => 2
|
2895
3364
|
# File.open('t.txt').fileno # => 10
|
3365
|
+
# f.close
|
2896
3366
|
#
|
2897
3367
|
# IO#to_i is an alias for IO#fileno.
|
2898
3368
|
#
|