ウィリアムのいたずらの、まちあるき、たべあるき

ウィリアムのいたずらが、街歩き、食べ物、音楽等の個人的見解を主に書くブログです(たま~にコンピューター関係も)

初めてのRubyを読む その39 8.3

2011-10-28 14:02:18 | Ruby
「初めてのRuby」を読むの続き

8章 オブジェクトとクラス
8.3 アクセス権限

から




■8.3 アクセス権限
・メソッドにはアクセス権限を設定できる
・3種類の権限設定が用意されている

  public
   どこからでも呼び出すことが出来る

  protected
   そのクラス又はサブクラスのインスタンスメソッドから
   しか、呼び出すことが出来ない

  private
   レシーバ省略形式でしか、呼び出すことができない
   したがって、selfに対してしか呼びさせない

 →JavaやC#と用語が似ているが、protectedやprivateが意味する
  ところは異なるので注意!


・おのおののアクセス権限設定には、メソッドが対応している
  ・デフォルトでは、class式の中で定義されたメソッドは
   public

  ・デフォルトでは、トップレベルで定義されたメソッドは
   private

  ・引数をつけずにメソッドpublicを呼び出すと、それ以降に定義
   されるメソッドはpublic
     →protected,privateでも同じ

  ・メソッドpublicにインスタンスメソッド名を文字列または
   シンボルで渡すと、そのメソッドはpublic
     →protected,privateでも同じ

  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

初めてのRubyを読む その38 8.2

2011-10-27 14:53:00 | Ruby
「初めてのRuby」を読むの続き

8章 オブジェクトとクラス
8.2 定数と変数

から




■8.2 定数と変数

・インスタンス変数、クラス変数、定数は、
 クラスと関係が深い




■8.2.1 インスタンス変数

・ここのオブジェクトは固有のインスタンス変数を持つことが出来る。
・インスタンス変数はそのオブジェクトの内部状態を表す変数
・先頭が@で始まる名前の変数はインスタンス変数
・オブジェクトAとオブジェクトBでインスタンス変数名が同じであっても
 別の変数
・インスタンス変数は所属しているオブジェクトのメソッドからしか
 アクセスできない
  →実は抜け道がある




■8.2.2 クラス変数
・クラス変数は、クラスと子孫クラス、それら全てのクラスのインスタンス間
 で共有される変数
・継承階層の全体で共有したいグローバルな状態を表現するのに使う
  →きわめてスコープの広い変数で、グローバル変数に近い




■8.2.3 定数
・定数は、クラスに属する変更不能な変数
・トップレベルに定数を記述すると、Objectクラスの定数
  →アクセスするには
     ::定数名
     Object::定数名






  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

初めてのRubyを読む その37 8.1

2011-10-27 00:13:08 | Ruby
「初めてのRuby」を読むの続き

今日から
8章 オブジェクトとクラス
8.1 クラス定義

から





■8 オブジェクトとクラス
・RubyはクラスベースのOOを主にサポート
  →基本的にはC++やJava,C#に似ている
・Rubyに特徴的な機能
  オブジェクトとしてのクラス
  メタクラス
  多重継承の利点を取り込むためのモジュール機能
  得意メソッド
・プロトタイプベースのOOもある程度は可能
・ArrayとHashを用いれば、最低限のデータ構造は構築できる
  →大きなプログラムを構築する才には、独自のクラスを
   定義する必要性




■8.1 クラス定義
・ユーザーが独自のクラスを定義するにはclass式を使う
・クラス定義の中には任意の式を書くことができる
  →圧倒的に多く行われるのは、インスタンスメソッドの定義

・クラス名は、必ず大文字デ始まる識別しでなければならない
  →クラス名が定数名でもあるから




■8.1.1 継承
・<(本当は小文字)に続けて他のクラスを指定すると、そのクラスを
 継承する

・class式において、親クラスを省略した場合はObjectクラスを継承する
  →複数のクラスを継承すること(多重継承)はできない

・一般に変更不能なクラスのサブクラスが変更可能なことは、よくない




■8.1.2 インスタンスメソッドの定義
・class式内部にdef式をかくと、そのメソッドはインスタンスメソッドになる。

・トップレベル関数もインスタンスメソッドの一種
  →Objectクラスに属している

・トップレベルに定義したメソッドは、レシーバーが何であれ呼び出せる
  →Rubyプログラムの任意の箇所でレシーバー省略形式により呼び出す
   ことができる




■8.1.3 クラスメソッドの定義
・特定のインスタンスでなく、クラス全体に属するメソッドが必要になるとき
  →C++やJava,C#にstaticメソッド
 クラス名をつけてメソッドを定義すると、そのメソッドはクラスメソッドになる

・このメソッドはクラスび直接属していて、インスタンスを介することなく
 呼び出せる




■8.1.4 インスタンス化
・クラスをインスタンス化するには、クラスメソッドnewを呼ぶ
 →newに渡した引数は、そのままinitializeに渡される
 →初期化されたインスタンスがnewメソッドから返ってくる

・Initialize
 このメソッドは、インスタンスを構築した直後に自動的に呼ばれる
 →インスタンスの初期化処理をおこなう
 →必要なリソースを確保したりする
   →コンストラクタのようなものです。




■8.1.5 属性
・オブジェクトの属性とは、オブジェクトに属していて、取得、設定が可能な値
 →実は、属性は単なるメソッド
 →見た目としては変数の一種

・属性の設定
 属性への値の設定を変数への代入と同じ要領で行う
 自己代入演算も、変数に対して行うのと同様に属性に対してもおこなうことができる

・属性の設定で行ったメソッドをどこで定義
  →Class#attr_accessor:属性メソッドを定義するメソッド
     →プログラムを作成すいるプログラム
      強力なメタプログラミング機能の一部

・予約語をメソッド名として問題なく使える
  →あまりおすすめできない




■8.1.6 クラス定義の追加
・定義済みのクラスに対して、いつでも定義を追加することができる
  →既存のクラスに対して、再びclass定義式を記述すれば、クラス定義を変更できる
    →定義追加の際には、親クラス指定を省くのが普通

・定義の上書き
 既存のメソッド定義を上書きすることもできる

・上書きの禁止
 どうしても定義の変更を禁止したい場合、Class#freezeメソッドを使う
  →初期状態はfreezeしていない:危険な操作であっても一律に禁止せず
   プログラマの良識に任せるのがRubyの文化




■8.1.7 スーパークラスの呼び出し
・super式は、メソッドの中から親クラスの同名のメソッドを呼び出す
  →元の挙動を利用しつつ、親クラスの挙動を上書きする際に重宝する
・superとだけ記述すると、現在のメソッドの引数をそのまま引き渡して
 親クラスの実装を呼び出す
  →引数を1つも渡さずに親クラスの実装を呼び出したい場合は、super()とかく

  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

初めてのRubyを読む その36 7.3

2011-10-25 16:56:04 | Ruby
「初めてのRuby」を読むの続き

7章 メソッド
7.3 ブロック付きメソッド

から




■7.3 ブロック付きメソッド

・メソッド呼び出しにはブロックを付加できる
  →引数とともにメソッドに引き渡される

・ブロック付きメソッド呼び出しの主な用途は3つ
  →ループの抽象化:2章
   ブロックへの機能追加。典型的にはリソース管理:5章
   コールバック関数・イベントハンドラ:Arrays.sort

・ブロックの数
  ・複数のブロックが必要になる場合はほとんどないことが
   歴史的に知られている
    →どうしても必要な場合は、Proc.newやlambdaを使う




■7.3.1 クロージャーとしてのブロック

・ブロックがクロージャーとして振舞っている
  →ブロック内に現れる自由変数はブロックの外部環境に従う
  →ブロックの外と中で変数が共有され、ブロック内で変数を
   書き換えると、外部にも影響する





■7.3.2 ブロック引数とブロックローカル変数
・メソッドに渡したブロックはメソッドから呼び返されるときに
 引数を受け取ることが出来る
・ブロックは独自のローカル変数をもちことが出来る
・Ruby1.9で文法が整理された
  →工法互換性が損なわれている

・Ruby1.9の場合
  ブロック付き呼び出しは、新しい変数スコープを用意する
  ブロック引数は、外部のローカル変数とは独立
    →同名の変数があっても、互いに影響しない
  ブロック変数に続けて、任意のブロックローカル変数を宣言することが出来る
   →これらの変数は、外部の同名のローカル変数とは独立したものになる
   →ブロック内の初出のローカル変数は、宣言しなくてもブロックローカル

・Ruby1.8
  ブロック引数はローカル変数と独立していない
   →同名のローカル変数があると、上書きする
   →ブロックローカルの宣言構文はない
   →初出のローカル変数がブロックローカルになるのは同じ

・以下の2点に気をつければ、1.8と1,9の混乱はされられる
  外部のローカル変数と同名のブロック引数を用いない
  外部で既出のローカル変数はブロック内外で共有(クロージャー)





■7.3.3 ブロック付きメソッドの定義
・特別な方法はなく、def式を用いて定義
・yield式は、メソッド内から呼び出し側のブロックをコールバックする構文
 →後に0個以上の式を取ることが出来る
 →それらの式の値をブロック呼び出し時に、ブロック引数として渡す
・イテレーター内のyield
 yieldを利用する点を除いては、ブロックつきメソッドは普通のメソッドと
 変わらない
   メソッド本体では任意の処理を行える
   どんな形でyieldを実行しても良い

・Enumeration
 Ruby1.9では、ブロックを付けずにイテレータを呼び出すと、Enumerable::Enumerator
 オブジェクトが返る
 ユーザー定義のイテレーターはそうはいかない
   →自前で明示的に実装する

・yield式は、ブロックの評価値を返す
  →ブロックをつけていない場合は例外発生




■7.3.4 Proc
・受け取ったブロックを変数に代入したり、他のメソッド呼び出しの引数にしたい
  →呼び出し側のブロックをオブジェクトとして取得したい
  →仮引数リストの最後に&で修飾された引数を置く
     →この引く数に呼び出し側のブロックをあらわすProcオブジェクトが
      格納される
・ブロックをProc化してためておいて後で使うのもよくある
・Procをコードブロックの代わりに引き渡す
  →&で修飾して、引数リストの最後におく

  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

初めてのRubyを読む その35 7.2

2011-10-25 15:59:16 | Ruby
「初めてのRuby」を読むの続き

7章 メソッド
7.2 メソッドの定義

から




■7.2.1 def式
・メソッドを定義するにはdef式を使う
・メソッド内には任意の式を並べることが出来、
 メソッドが呼ばれると実行
   →メソッドの本体
・メソッド内で最後に評価された式の値が戻り値になる




■7.2.2 return
・メソッド内から陽に戻り値を返すにはreturnを用いることが出来る
・戻り値の式は省略可能
  →省略してreturnだけ書くと、nilが返る
・returnは必須でない
  →returnに出会わずメソッド末尾に到達すると
   最後の式の値が戻り値

・多値の返却
 returnの後に、カンマ区切りで複数の式を書くことが出来る
  →配列が返る
 呼び出し側では、多重代入の要領で多値として受け取る
 多値を返す場合は、return必要

・値を返さないメソッドは存在しない
  →返り値に使い道がない場合はnilを返す




■7.2.3 デフォルト値
・引数にデフォルト値を指定できる
 →呼び出し時に指定しないとデフォルト値適用

・デフォルト値を持っている仮引数のことを省略可能な引数という
 →デフォルト値が定義されていない引数を省略するとエラー
 →Ruby1.8においては、省略可能な引数より後に
  省略不能な引数が存在してはならない

・デフォルト値の評価コンテキスト
 デフォルト値には任意の式を指定できる
  →呼び出し時にデフォルト値が必要になると、毎回評価
     →レシーバーのコンテキストで評価される
     →式を都度評価する:メソッド定義時には確定しない




■7.2.4 可変長引数
・呼び出すケースことに引数の数が異なるもの
  →pなど
 仮引数の中のいずれか1つを、可変長引数の受け皿にすることができる
  →*をつける:配列として割り当てられる

・スコープの発生
 メソッド本体のローカル変数スコープは外部と完全に独立している
 →メソッド本体の自由変数が外部環境によって解決されることはない
 →クロージャーとは異なる。


  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

初めてのRubyを読む その34 7.1

2011-10-21 23:56:07 | Ruby
「初めてのRuby」を読むの続き

今日から
7章 メソッド

7.1 メソッド呼び出し
から




■7章 メソッド

・メソッド:Rubyにおいて手続きをモジュール化し、再利用するための仕組み
  オブジェクト指向のメッセージ送信と
  構造化プログラミングのサブルーチン
 両方の役割

・関数型メソッド
  オブジェクトとは無関係に呼びさせる




■7.1 メソッド呼び出し
・Rubyプログラムにおけるすべてのデータはメソッドを持っている
  →どんなメソッドを持っているかは、クラスによる
・Rubyプログラミングで中心的な役割を果たすのがオブジェクトに
 対するメソッド呼び出し

・メソッドを呼び出すには、レシーバー、メソッド名、引数を以下のように書く

   a.some_method(1,"str")
   a::some_method(1,"str")

 クラスメソッドを呼ぶ場合を除いて、第一のスタイルが主流




■7.1.1 括弧の省略

・引数をくくる括弧はあいまいさを生まない限り省略可能




■7.1.2 メソッド連鎖

・メソッドは必ず何らかの値を返す
  →メソッドの返り値ないし戻り値という
  →返り値に対してメソッドを呼ぶことも可能
     →メソッドチェーン




■7.1.3 レシーバーの省略

・メソッドを呼び出すレシーバーを省略することができる
  →この場合は、デフォルトのレシーバーである
   selfに対してメソッドが呼ばれる
     →C++,Javaなどのthis

・擬似変数selfは常に「現在のレシーバー」をさしている

・privateメソッドは、常にレシーバーを省略形式で呼び出す。


・レシーバー省略とローカル変数
 引数をもたないメソッドのレシーバーを省略すると、
 ローカル変数の参照と見分けつかない
   →ローカル変数優先
 関数的メソッドでも形式的にはレシーバーを持っている

・組み込み関数
 どこからでも呼び出せる便利な関数メソッド
 Kernelモジュールのメソッド




■7.1.4 引数展開
・ * 修飾により、配列に格納された値を引数リストに
 展開できる

・Ruby1.8では、 * 付き要素は引数リストの最後
 Rubyi.9では、出現位置、回数ともフリー
 配列から引数リストへの自動的展開は行わない


・関数型メソッド
 非オブジェクト指向的に用いられるメソッド
 レシーバーを持たない手続き


  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

初めてのRubyを読む その33 6.5

2011-10-20 16:22:19 | Ruby
「初めてのRuby」を読むの続き

6章 変数と式
6.5 大域脱出
から




■6.5 大域脱出
・深い入れ子からの脱出
catch(:exit)
{
loop do
  loop do
    throw :exit
  end
 end
}

・上記の例の場合、throwで書いた識別名(:exit)と同じ識別名をもつ
catchの外側にまで出る

・対応するcatchが見つからないと、ArgumentError






  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

初めてのRubyを読む その32 6.4

2011-10-19 15:08:40 | Ruby
「初めてのRuby」を読むの続き

6章 変数と式
6.4 例外処理
から




■6.4 例外処理
・Rubyも例外処理を持っている
  →Rubyライブラリのほとんどは例外によって
   利用者プログラムにエラーを通知

・例外を用いるには
   ・begin endでくくる
   ・例外が発生した場合、対応したrescue節にジャンプ
   ・例外オブジェクトを捕捉変数に入れて、処理を制御句へ
      クラス指定を省略するとStanderdError指定
      例外オブジェクトを使わなければ捕捉変数省略可能
   ・else句があると、例外が発生しなかった場合実行
   ・ensure句は例外の有無にかかわらず実行
      →必要ないとき、else,ensureは省略可能

■6.4.1 rescue修飾子
・簡潔な例外処理記法としてrescue修飾子がある

  do_something rescue error_handring

・左辺の実行中にエラーが発生すると、右辺を実行
・例外クラスを指定したり、例外オブジェクトを捕捉することはできない

■6.4.2 raise
・ユーザーが明示的に例外を発生させるには、組み込み関数raiseを使う
・エラーメッセージ、例外クラスは省略可能
  →省略すると、RuntimeError


  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

初めてのRubyを読む その30 6.2

2011-10-17 23:59:53 | Ruby
「初めてのRuby」を読むの続き

6章 変数と式
6.2 演算子
から





■6.2 演算子
 いっぱいある。省略


■6.2.1 再定義可能な演算子
・演算子の大部分は、実際にはメソッド呼び出しを読みやすくするための
 シンタックスシュガー
  →再定義可能

 意味
  再定義可能な演算の場合、同じ演算子でもメソッド呼び出しを受ける
  オブジェクトによって意味は異なる

 自己代入演算子
  2項演算子と代入を組み合わせたもの(+=とか)
  →自己代入演算は再定義できない

 否定演算子
  != 比較演算子==の否定
  !~ パターンマッチ演算子=~の否定
 →Ruby1.8では否定演算子は再定義できない
  Ruby1.9では再定義可能

 インクリメント演算子、デクリメント演算子は、ない。




■6.2.2 再定義不能な演算子
・一部の演算子は言語本体の仕様で意味が決まっている
  →再定義不能

  代入
   = オブジェクトの参照を代入
     →a = b = c = 1のようにつなげて代入できる

  多重代入
   複数の式を並行して代入できる
    a,b,c = 1,2,3
   両辺の項目が合わない場合、あまったら捨てられ、足らないとnil

  多値と配列展開
   *が左辺に出ると、多値を配列にまとめてくれる
     a,*b=1,2,3,4,5
     p b   => [2,3,4,5]

   *が右辺に出ると、配列を多値に展開
     array=[1,2,3]
     a,b,c=*array
     p a => 1

   括弧を展開してくれる
     (a,(b,(c,d)),e) = [1,[2,[3,4]],5]
p [a,b,c,d,e]  => [1,2,3,4,5]
 
  要素への代入
   配列要素やハッシュ要素への代入
     →[]=メソッドの呼び出し



■6.2.3 論理演算子
・論理演算子は真偽判断を扱うための再定義不能な演算子
  →! not , && and, || orという意味は同じで優先順位だけ
   違う相方を持っている

・否定論理演算し
  !,!=,!~
   →Ruby1.9では再定義できるが、真偽値は変わらない
      →フックするために再定義できる

・論理和、論理積演算子
  オペランドのいずれかを返す
   例 nil || 50 → 50とかえる(trueでもfalseでもない)

・短絡評価
  論理和、論理積の評価は短絡する
   →副作用が発生しない場合がある

・初期化イディオム
  @a ||= b
    @aが真のとき、何もしない
    @aが偽のとき、bメソッドを読んで、戻り値でaを初期化




■6.2.4 範囲演算子
・ a..b aからb(bが含まれる)
・ a...b aからbの前まで(bは含まれない)




■6.2.5 条件演算子
・条件によって値を振り分ける a ? b : c
 if文と同じ
 空白を省略してa?b:c とかくと、構文エラー


  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

初めてのRubyを読む その29 6.1

2011-10-14 15:25:44 | Ruby
「初めてのRuby」を読むの続き

今日から6章
6章 変数と式
6.1 変数
から




■6.1 変数

・変数:オブジェクトにつける名札




■6.1.1 参照
・変数が保持するものは、オブジェクトへの参照
  →オブジェクトそのもの、値そのものではない
    →複数の変数が同じオブジェクトを
     参照している可能性もある

・呼び出し元の変数とメソッドの仮引数がオブジェクトを共有
  →メソッド内部で引数オブジェクトを変更すると、
   呼び出し元へも兵供してしまう
    →呼び出し元に影響を与えたくなければ
     複製してから利用する




■6.1.2 変数の種類

・変数にはいくつかの種類があり、スコープが異なる
   ローカル変数
   インスタンス変数
   クラス変数
   グローバル変数
   定数

・Rubyには、変数宣言という構文がない
  →変数名によって、自動的に変数の種類が定まる
   先頭1文字をみて判断する




■6.1.3 ローカル変数
・特定のメソッドや呼び出しやクラス定義、ファイル実行の中だけで利用できる
・特に理由がない限り、ローカル変数を使用する
・メソッド定義のdef・・・endを境界としてスコープ分離
   →同名でも境界を越えたら別変数
   →class・・・endやファイルもローカル変数のスコープを分離
・最初の代入式で発生




■6.1.4 インスタンス変数
・インスタンス定数は、特定のオブジェクトに属する変数
 →同じオブジェクトのメソッドの間で共有




■6.1.5 クラス変数
・クラス変数は基本的にはクラスに属する変数




■6.1.6 グローバル変数
・どこからでも参照可能な変数
 どこからでも代入できる

・組み込み変数:特殊なグローバル変数
  $stdout,$1,$2など



■6.1.7 定数
・変更されない変数
 →変更すると警告がでる(変更は出来る)

・特定のクラスやモジュールに属する
  →クラス定義に含まれないものは
   Objectクラスに所属

・ライブラリ:定数を提供してくれている




■6.1.8 擬似変数
・以下の7つの変数をさす
  nil
  true
  false
  self
  __FILE__
  __LINE__
  __ENCODING__

・Ruby処理系が示すオブジェクトを参照
  →ユーザーは定義できない




■6.1.9 識別名と変数名
・Rubyも変数めいめいには一定の制約
  →かなり緩やか
  →先頭文字以外は、ASCII記号を除く任意の印刷可能文字
   または_

・予約語がある

・慣習的制約
  大文字、小文字で単語を区切らない
    →_で区切る
  クラス名のみは例外でPascalStyleを用いる




  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

初めてのRubyを読む その28 5.5

2011-10-13 15:53:13 | Ruby
「初めてのRuby」を読むの続き

5章 入出力
5.5 エンコーディング
から




■5.5 エンコーディング

・Ruby1.9:入出力も文字エンコーディングを扱う
・プログラムと外部データ両方のエンコーディング情報を保持
 →両者間で変換




■5.5.1 外部エンコーディング
・外部リソースのエンコーディング
 →指定するには、リソースを開く際のモード文字列に
  エンコーディング名を追加

  File.open("a.txt","r:UTF-16BE")

・デフォルトの外部エンコーディング
 外部エンコーディングを指定しない場合、デフォルトのエンコーディング
  →Encoding.default_externalで参照できる
     →自動的に設定される
     →プロセス起動時に-Eオプションで設定できる
     →-Kにも影響を受ける




■5.5.2 内部エンコーディング
・ファイルを通じて読み書きする文字列のためのエンコーディング
   →デフォルトはnil(変換されない)
   →外部エンコーディングと内部エンコーディングを変えることもできる




次回から6章 変数と式


  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

初めてのRubyを読む その27 5.4

2011-10-12 15:24:56 | Ruby
「初めてのRuby」を読むの続き

5章 入出力
5.4 その他の入出力オブジェクト
から




■5.4 その他の入出力オブジェクト
・いくつものIOオブジェクトや
 IOオブジェクトに似たオブジェクトが存在




■5.4.1 ARGF
・組み込み定数ARGF
  →プログラムの定数に基づいて構成される
   仮想のファイル

   例:
   ruby 05-010-argf.rb a.txt b.txt c.txt

   →ARGFで、a.txt,b.txt,c.txt1つにしたファイル
    読み込みができる

   ARGF.each_line do | line |
    print line
   end

・引数をつけずに呼び出すと、標準入力から読み込み
  →Unix互換システムにおける一般的な挙動と同じ

・ARGFはIOクラスのインスタンスではないが、
 IOクラスと同じようなメソッドを持っている
  →このような多態性をダッグタイピングという
     →アヒルのように歩き、鳴くならば、
      それはアヒルである




■5.4.2 StringIO
・文字列に対して、それがIOオブジェクトであるかのように
 入出力を行うためのラッパークラス

・StringIOを使えば、文字列とIOクラスのダッグタイピングが
 実現可能

  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

初めてのRubyを読む その26 5.3

2011-10-11 14:45:30 | Ruby
「初めてのRuby」を読むの続き

5章 入出力
5.3 標準入出力
から




■5.3 標準入出力

・組み込み変数$stdin,$stdout,$stderr
  →標準入出力をあらわすIOオブジェクトを保持
    IOクラス:Fileクラスの親クラス

・多くのシステムでは、デフォルトの標準入出力はコンソール
  →リダイレクトされると変わる

・Rubyのエラーメッセージは$stderr宛てに出力

・変数に他のIOオブジェクトを代入すると、入出力先も変化
  →STDIN,STDOUT,STDERRに初期値を保存


  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

初めてのRubyを読む その25 5.2

2011-10-07 15:32:27 | Ruby
「初めてのRuby」を読むの続き

今日から5章。

5章 入出力
5.2 ファイル
から




■5.2 ファイル

・Fileオブジェクトはファイルシステムの入出力インターフェースを提供
  →ブロック付きメソッドとして書いた場合、ブロック内は、
   自動的に閉じてくれる





■5.2.1 ファイルのモード

・File.openはデフォルトでは、読み込み専用モードで開く
   →書き込めない。書こうとするとIOError
   →他のモードで開くには、引数で指定する。

 例:
  File.open("time.log",'a'){|f|
   f.puts Time.now
  }

・ビットによるモード指定
  ファイルのモードを整数で指定することにより、
  もっと細かい挙動も指定できる
   →ビット和で任意に組み合わせ

 例:
  File.open("time.log",File::WRONLY|File::CREAT){|f|
   f.puts Time.now
  }





■5.2.2 イテレーター

・ファイルの内容を順に読み込む場合には、イテレーターが便利
  →バイトごとの繰り返しeach_byteと
   行ごとの繰り返しeach_lineがある
  →イテレーターは、順アクセス





■5.2.3 ランダムアクセス
・Fileオブジェクトは読み書きするバイト位置を保持している
   →読み書きすると、自動的にバイト位置変わる

・バイト位置の取得、設定:Fileのpos属性
 位置の設定Fileのseekメソッド
   →第二引数により、位置を変えられる
      SEEK_SET 先頭
      SEEK_CUR 現在の位置
      SEEK_END 末尾




■5.2.4 手動によるリソース管理

・Fileオブジェクトを変数に入れる
   →ブロックをつけずにFileを呼び出すと、返り値に
    Fileオブジェクトを返す

・File.openメソッドが戻った後も開いた状態
   →File.closeメソッドを呼び出す。


  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

初めてのRubyを読む その24 5.1

2011-10-06 12:54:54 | Ruby
「初めてのRuby」を読むの続き

今日から5章。

5章 入出力
5.1 プログラムへの引数
から




■5章 入出力
・今までも p , print , puts は利用

・Rubyにおける入出力において最も重要なものはIOクラス
  →システムコールレベルやC言語のファイル記述子をラップ
   ファイルのように扱えるものへのインターフェース提供
     ソケット、パイプ、端末など・・




■5.1 プログラムへの引数

・起動する際に、外部から引数を渡すことが出来る
  →組み込み定数 ARGV を使って引数にアクセス
   →ARGVは引数文字列の配列
   →実行したソースファイル名、Ruby処理系の引数は入らない








  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする