JS/ES – 関数式/無名関数/即時関数

関数式~関数の変数への代入

ユーザー定義関数はfunctionキーワードの後に関数名を指定して関数を定義し、その関数名で関数を呼び出して実行した。

これに対して、関数を変数に代入して、その変数名を用いて関数を実行することができる(関数式:function formula)。

無名関数

このような使い方で、関数名自体を指定せずに関数の実体を変数に代入することもできる。

このように名前を持たない関数を無名関数/匿名関数(anonymous function)と呼んでいる。

このような無名関数を変数に与える関数式は、メソッドや関数の引数に関数を与えることが想定されている場合に用いる。たとえばDOMに対するイベントリスナーの登録や、配列オブジェクトのreduce()メソッドに合計を計算するためのreducerを与える例など、その活用場面は多い。

即時関数

さらに、関数の変数への代入自体も省いて、無名関数のまま実行させてしまう書き方を即時関数(immediately-invoked function express: IIFE)と呼んでいる。

この記法は、varによる変数定義が関数スコープであることを利用して、変数の汚染を防ぐために使われる。

ES6以降導入されたブロックスコープより前にはグローバルスコープと関数スコープしかなかったため、必要なコード全体をIIFEの中に納めて、そのスコープ外の変数と独立させようという考え。

 

JS/ES – 変数のスコープ

スコープの種類と宣言キーワード

スコープの種類

グローバルスコープ

ドキュメント内のどこからでも参照可能。

関数スコープ

宣言された関数内でのみ参照可能。関数内の入れ子の関数・ブロックからは参照可能。

ブロックスコープ

宣言されたブロック内でのみ参照可能。ブロック内の入れ子の関数・ブロックからは参照可能。

宣言キーワードとスコープ

キーワードなしの宣言

ドキュメント内のどこからでも参照可能なグローバルスコープ。

var

宣言された関数内の関数スコープ。

  • ドキュメント直下で宣言した場合、グローバルスコープ
  • 関数で宣言した場合、その関数内のスコープ
  • ブロック内で宣言した場合、そのすぐ外側の関数のスコープ(ブロックがドキュメント直下にあればグローバルスコープ)

let, const

宣言されたブロック内のブロックスコープ。

  • ドキュメント直下で宣言した場合、グローバルスコープ
  • 関数で宣言した場合、その関数内のスコープ

確認

グローバルスコープ

JSコード

実行結果

 

関数スコープ

  • var, let, constとも関数内で宣言された場合はその関数内のみのスコープ
  • 宣言された関数の中に入れ子で宣言された関数からは参照可能
  • 入れ子の内側の関数内で宣言されたvar, let, constは、外側の関数からは参照できない

JSコード

実行結果

ブロックスコープ

  • var宣言はブロック内外に関わらず参照可能
  • let, constは宣言されたブロック内のみのスコープ
  • 宣言されたブロックの中の入れ子のブロックからは参照可能
  • 入れ子の内側のブロック内で宣言されたvar, let, constは、外側のブロックからは参照できない

JSコード

実行結果

 

Ruby – ファイル操作

要点

  • Fileクラスを使うことで、開いたファイルをオブジェクトとして扱える
  • Fileはopenメソッドで開き、closeメソッドで閉じる
  • openメソッドで開いたファイルオブジェクトに対して、行単位の読み込みなどの処理を行う

ファイルのオープン/クローズ

ファイルのオープンにはFile#openメソッドを使う。第1引数でファイルのパス、第2引数でファイルを開くモードを文字列で指定。

変数 = File.open("ファイルへのパス", "モード")

モード指定の例は以下の通り。

"r" 読込 デフォルト
"w" 書込 ファイルが存在している場合は内容を空にする
"a" 追加 ファイルが存在している場合は末尾に追加する
"r+" 読書 ポインターはファイルの先頭にセット
"w+" 読書 ファイルが存在している場合は内容を空にする
"a+" 読書 読込位置は先頭、書き込み位置は末尾にセット

ファイルのクローズにはcloseメソッドを使う。

ファイルオブジェクトの変数.close

以下はファイル名を指定してファイルを開き、何もせずにクローズする例。

以下の構文は、ファイルのクローズを明示しなくても完結する。

ただしこれには注意が必要。このブロックの中で定義した変数でファイルの内容を読み込むと、ブロックの外ではその変数は使えない(ブロック内スコープ)。

ブロック内で読んだ内容を外で参照するためには、ブロック外で変数が定義されている必要がある。

ファイルの読み込み

一括読込

ファイルの読み込みは、ファイルオブジェクトのreadメソッドを使う。

行ごとの読み込み

Fileオブジェクトのeach_lineメソッドを使うと、行単位で読み込んでくれる。

行番号

Fileオブジェクトのlinenoプロパティーは、現在読んでいる位置の行番号を持っている。

ファイルの書き込み

ファイルの書き込みはopenの第2引数で"w"を指定する。ファイルが存在すればその内容が空にされ、ファイルが存在しなければ新たに作られる。

 

Ruby – dateライブラリー

導入

require("date")でライブラリーを読み込むとDateクラスが使えるようになる。

Dateオブジェクトの生成

Dateクラスのコンストラクターの引数で年、月、日を指定する。

parseクラスメソッドに様々な形の日付文字列を与えてDateオブジェクトを生成。

todayクラスメソッドは今日の日付でDateオブジェクトを生成。

値の取り出し

年月日や曜日番号を個別に取り出し。

日付の書式付表示

strftimeメソッドの引数で書式を設定。

主な書式文字

%C 世紀
%Y 西暦年
%y 西暦年の下2桁
%m 月(01-12)
%d 日(01-31)
%w 曜日番号(日曜:0~土曜:6)
%u 曜日番号(月曜:1~日曜:7)
%A 曜日の名称(Monday, Tuesday, …)
%a 曜日の略称(Mon, Tue, …)

 

Ruby – ハッシュ

ハッシュの定義

ハッシュは{}で囲み、key => valueをカンマで連ねて定義する。

空のハッシュは次のいずれかで。

ハッシュのサイズ

ハッシュのサイズはsizelengthで取得。

ハッシュが空かどうかはempty?で確認できる。

キーと値のリスト

keysvaluesでキーや値のリストが得られる。

キーと値の検索

has_key?、has_value?でキーや値の存在を確認。

値の参照・追加・変更

キーを指定して値を参照。存在しない場合はnil

新たなキーを指定してアイテムを追加。

キーを指定してアイテムを削除。

キーを指定して値を変更。

キーと値の順次取り出し

eachメソッドでキーと値のセットを順次取り出す。

シンボルによるキーの設定

:key => valueの形で、キーをシンボルで設定できる。

シンボルで設定する場合、key: valueの形でも設定できる。ただし参照する場合は:keyの形で。

キーのリストもシンボルで表示される。

 

Ruby – chop/chop!~末尾文字の削除

chopは文字列の末尾1文字を削除する。

末尾に改行文字がある場合は、それらが削除される。ただし"\n\r"の場合だけは"\n"が削除されずに残る。

chopは非破壊的であり、元の文字列は変更されない。

chop!にすると破壊的メソッドになり、戻り値も変更後の文字列。

 

Ruby – 配列の演算

概要

Rubyの配列同士の演算はPythonのようにブロードキャストされない。加算/減算はそれぞれ和集合/差集合のように扱われる。

配列同士の加算

+~加算は和集合

配列同士をで加算すると双方の和集合となる。

必ずしも重複が削除されるわけではない。

~減算は差集合

減算の場合、元の配列から重なる要素だけが削除される。下の例ではabに共通な[3, 4]が削除され、[5, 6]はもともとaに含まれていないので無視される。

積集合の求め方

加算と減算を組み合わせて、2つの配列の席集合に相当する配列が得られる。

要素の追加

<<演算子は左辺の配列に右辺の要素を追加する。連続して複数の要素も追加可能。push()と同じ動作。

 

Ruby – 配列メソッド

概要

配列オブジェクトのメソッドのには破壊系と非破壊系があり、注意を要する。

パラメーター系

size/length~要素数の取得

sizeメソッド、lengthメソッドとも配列の要素数を返すエイリアス。

sum~合計値の取得

sumメソッドは配列要素の合計値を返す。

要素抽出系

first/last~先頭要素/末尾要素の取得

firstメソッドは配列の先頭の要素、lastメソッドは末尾の要素を返す。

sample~ランダムな要素取得

sampleメソッドは配列からランダムに1つ要素を返す。引数を指定すると重複なしでその個数分のサンプル配列を返すが、引数が要素数を超えた場合は全要素がランダムに並べられた配列が返される。

破壊的メソッド

push/unshift~要素の追加

pushメソッドは配列の末尾に要素を追加し、unshiftメソッドは配列の先頭に要素を追加する。いずれも元の配列を変更する(要素の追加は<<演算子でもできる)。

pop/shift~要素の取出し

popメソッドは配列の末尾から要素を取り出し、shiftメソッドは配列の先頭から要素を取り出す。いずれも元の配列が変更され、取り出された要素が戻り値となる。

非破壊的メソッド

reverse~要素の順番の反転

reverseメソッドは、元の配列の要素の順番を反転した配列を新たに生成して返す。

sort~昇順ソート

sortメソッドは、元の配列を昇順でソートした配列を生成して返す。文字列オブジェクトの場合は辞書順で、大文字→小文字の順。

sort.reverse~降順ソート

sortメソッドとreverseメソッドの組み合わせで、降順にソートされた配列が生成されて返される。

uniq~重複要素の削除

uniqは配列中の重複した要素を削除して1つにし、重複のない配列とする。元の配列は変更されず、新たな配列が生成される。

shuffle~要素のシャッフル

shuffleメソッドは、元の配列の要素をランダムに並べ替えた配列を生成して返す。

文字列化・配列化

split~文字列の配列への分解

splitメソッドは、指定した文字列で元の文字列を区切って、それぞれが要素となる配列を生成する。

join~配列要素の文字列への結合

joinメソッドは、配列の各要素を指定した文字列でつないだ文字列を生成する。

 

Ruby – 文字列メソッド

length~文字列の長さ

半角も全角も1文字。

結合系

+~文字列の連結

+演算子は文字列同士を結合する。半角と全角の連結もok。

join~配列要素の文字列化

配列のメソッドだが、joinメソッドは配列要素を指定した文字列で結合して文字列にする。

分割系

split~文字列の配列への分割

引数で指定した文字列で元の文字列を分解して配列化。

2つ目の例から、引数で指定した文字列"--"が見つかるたびに、そこまでの文字列を要素として配列に加えていることがわかる。

削除系

delete~特定の文字の削除

引数で指定した文字列を削除。

strip~前後のスペースの削除

半角スペースを削除。全角スペースは削除されない

chop/chop!~末尾文字の削除

chop/chop!は末尾文字を削除する。

chomp/chomp!~末尾の改行文字の削除

chomp/chomp!は末尾文字を削除する。

変換系

upcase/downcase~大文字化/小文字化

アルファベットの大文字化/小文字化。

 

Ruby – コメント

1行コメント~#

文頭に'#'があると、以降行末までコメントになる。

複数行コメント~=begin/=end

=begin=endの間の行は埋め込みドキュメントとして実行時には無視される。=begin=endはそれぞれ行頭になければならない。

__END__の応用

__END__はコードの終端を示し、それ以降の記述は実行対象にならない。