leaning diary Rails

【Learning Diary48】compact!とcompact/IO.write/IO.readlines/IO.open

compact!とcompact

Array#compactは、selfからnilを取り除くメソッドです。

 

しかし、「!」がない場合は、selfは変更されません。

 

Array#compact!によって、selfは変更されます。

 

>> a = [1]
=> [1]
>> a[7] = 77
=> 77
>> a.compact
>> p a
[1, nil, nil, nil, nil, nil, nil, 77]
=> [1, nil, nil, nil, nil, nil, nil, 77]
>> a.compact!
=> [1, 77]

 

IO.writeメソッド

 

プログラムの外部とデータをやり取りするための機能として入力(Input)と出力(Output)を使えるようにしてくれるのがIOクラスです。

 

IO.writeメソッドは、Fileオブジェクトを作らずにdateにデータを書き込みます。

 

dateの書き込みを行った後はファイル閉じます。

 

offsetを省略した場合は、fileの内容をすべてdateに置き換えます。

 

# readme.md

 

IO.write("readme.md", "Ruby\nExamination\n")

 

実行。

ruby IO.write.rb

 

# readme.md

Ruby
Examination

 

offsetを指定した場合は、先頭からoffsetバイト以降に書き込み、その後のデータは元のまま残ります。

 

IO.write("readme.md", "★",16)

 

Ruby
Examination★

 

IO.readlinesメソッド

io.readline(rs)はIOオブジェクト(io)からデータを1行読み込みます。

 

区切りは引数rsで指定した文字列になります。

 

引数を省略した場合は、組み込み変数(デフォルトでは"\n")が行の区切りになります。

 

 IO.openメソッド

io = File.open(file[, mode[, perm][, opt])

io = open(file[, mode[, perm][, opt])

 

IO.openメソッドはファイルを開いて新しいFileオブジェクトを得るのに使います。

 

modeにはどのような目的でファイルを開くかを指定します。

 

modeを省略した場合は、読み込み専用"r"となります。

 

mode

"r" : 読み込み専用

"r+": 読み込み/書き込み用

"w": 書き込み専用。ファイルがなければ新たに作成する。既に存在する場合はファイルの内容を空にします。

"w+": 読み込み/書き込み用。ほかは"w"と同じ。

"a": 追加書き込み専用でファイルを開く。ファイルがなければ新たに作成する。

"a+":読み込み/追加書き込み用。ファイルがなければ新たに作成します。出力は 常に ファイルの末尾に追加されます。

 

# textfile.txt

recode 1
recode 2
recode 3

 

f.rewindは、ファイルポインタをファイルの先頭に移動するメソッドです。

modeで"r+"を指定してみます。

 

# io_open.rb

open('textfile.txt', "r+") do |f|
  data = f.read.upcase
  f.rewind 
  f.puts data
end

 

実行。

ruby io_open.rb

 

# textfile.txt

RECODE 1
RECODE 2
RECODE 3

 

"w"を指定すると、f.readでエラーがおきます。

 

open('textfile.txt', "w") do |f|
  data = f.read.upcase
  f.rewind
  f.puts data
end



io_open.rb:2:in `read': not opened for reading (IOError)
    from io_open.rb:2:in `block in <main>'
    from io_open.rb:1:in `open'
    from io_open.rb:1:in `<main>'

 

"w+"を指定した場合。

open('textfile.txt', "w+") do |f|
  data = f.read.upcase
  f.rewind
  f.puts data
end

#textfile.txt

 

"a+"を指定した場合。

open('textfile.txt', "a+") do |f|
  data = f.read.upcase
  f.rewind
  f.puts data
end

# textfile.txt
recode 1
recode 2
recode 3
RECODE 1
RECODE 2
RECODE 3\

 

参照:module function Kernel.#open

 

 

-leaning diary, Rails