学習記録 (2月15-16日)

2/16

(rdbg) p a.mode    # command
=> 16877
(rdbg) p a.mode.to_s(8)    # command
=> "40755"
(rdbg) puts "0%o" % a.mode     # ruby
040755
nil
(rdbg) puts a.mode.to_s(8)    # ruby
40755
nil
(rdbg) printf  "0%o\n" , a.mode     # ruby
040755
nil

#進数%oの前に0を入れることで0が左にはいる

0bや0xなど接頭子が付いた文字列が必要な場合は、kernelのsprintfを使うのが簡単だ。以下のようにして2進、8進数、10進数、16進数の文字列を得る。

p sprintf("%#b", 255) #=> "0b11111111"
p sprintf("%#o", 255) #=> "0377"
p sprintf("%#d", 255) #=> "255"
p sprintf("%#x", 255) #=> "0xff"

sprintfはString#%として書くこともできる。ただこれ、%がsprintfというのが直感的でなく、可読性があまり良いとは思えないので、個人的には好きではない。

p "%#b" % 255 #=> "0b11111111"
p "%#o" % 255 #=> "0377"
p "%#d" % 255 #=> "255"
p "%#x" % 255 #=> "0xff"
  • printf:書式を指定して出力。戻り値はnil
printf('商品情報: カテゴリー %s 型番 %d', 'bag', 10111)
#[実行結果]
商品情報: カテゴリー bag 型番 10111

桁数を右揃えで指定 : printf("%5s","abc") 左揃え : printf("%-5s","abc")

#数値型の桁数を指定する場合も、文字数を指定する場合同様です。

puts "12345"
printf("%5d",123)
#[実行結果]
12345
  123 

#数値型の場合は、空白に0を詰めて表示できます。

puts "12345"
printf("%05d",123)
#[実行結果]
12345
00123
#このように、5桁に対して足りない部分は0で補われています。
  • springf:printfメソッドがコンソールに対して直接出力するのに対して、sprintfメソッドは文字配列に対して出力するためのメソッドになります。戻り値を出す。

printfとは 与えられた引数を指定フォーマットの文字列として出力します。 似たような名前のsprintfは「文字列として返す」のに対して、今回のprintfは「文字列として出力(表示)する」点が異なります

p sprintf("明日、%sの最高気温は%d度です。","サムライ村",33)
#[実行結果]
"明日、サムライ村の最高気温は33度です。"
  • これを使いたい/ printで改行なしで。
#また、その際には変数展開と呼ばれる記法を使用して、ハッシュの中身を展開します。
hash = {ruby:"Rails",php:"CakePHP",python:"Django"}
hash.each do |key,value|
puts "#{key}の有名Webフレームワークは#{value}です。"
end
#[実行結果]

rubyの有名WebフレームワークはRailsです。
phpの有名WebフレームワークはCakePHPです。
pythonの有名WebフレームワークはDjangoです

2/17

  • 正規表現
  • \dは任意の半角数字1文字 \dは\wに含まれる
  • \wは英単語を構成する文字+アンダースコア [a-zA-Z0-9_]
  • \d{2,5} : 半角数字が2-5文字
  • [AZ] : AまたはZ、またはの間になんの仕切りもなく並んでいるので連続している文字列に見えるのに注意
  • [A-Z] : AまたはBまたは...またはZ
  • [-AZ]、[AZ-] : -またはAまたはZ
  • 正規表現を使うときには//で囲む
  • [-AZ]]? : -またはAまたはZ または無し
  • (-AZ)? : 文字列'-AZ' または無し
  • '.' : 任意の1文字
  • '+' : 直前の文字が1文字以上
  • * : 0文字以上 '.*' =任意の文字0文字以上
  • '\A'は文字列の始まり、'\z'は文字列の終わりを意味する
  • '^': 以外の '^A'*='A以外の任意の文字'
  • ’^’: 行頭
  • ’?’: 最短マッチ *?/.?/+? 貪欲さを消す
  • '$' : 行末 '^ +$' = 行末まで半角スペースが続く文字列、改行文字は含まれないので行末に'\n'を指定することもできる。
  • '\t':タブを表すメタ文字
  • '\s': 半角、タブ空白文字全般 \s = [ \t\r\n\f]
    • Rubyの場合は半角スペース( )、タブ文字(\t)
    • 改行文字(\n)、復帰文字(\r)、改ページ文字(\f)
    • かっこで囲って |でつなぐ ^.+heroku\/(api|scheduler).+$

  • '==','===','eql!''equal?'の比較.

    効果 / 使用場面 / 再定義 == 同値性のチェック 同値性のチェック ○ === 同値性のチェック(所属性) case式 ○ eql? 同値性のチェック(厳密) Hashキーの比較 ○(※) equal? 同一性のチェック 同一性のチェック ×

  • equal?はobject_idのチェックを行う

  • .scanメソッド: オブジェクトと同一の結果を配列で返す 引数の中に正規表現が入る場合は//で囲む

  • grepメソッド(配列ー配列) :配列.grep(オブジェクト) 正規表現に対してはパターンにマッチした要素を返す

  • 正規表現をメタ文字とも呼ぶ

  • 正規表現に()を使うとその部分かキャプチャされ連番がつけられる

正規表現で名前付きキャプチャを使う

  • 名前付きキャプチャ : (?<キー>値)でキャプチャしてk<キー>値で指定

    s = '2016-05-08' 
    
      puts s.gsub(/(\d+)-(\d+)-(\d+)/, '\1年\2月\3日')
    # => 2016年05月08日
    

    連番を使う場合のキャプチャは ( ) ですが、名前付きキャプチャを使う場合は次のような構文を使います。

  
  (?<name>pattern)

   puts s.gsub(/(?<year>\d+)-(?<month>\d+)-(?<day>\d+)/, '\k<year>年\k<month>月\k<day>日')
  • キャプチャしたものを出力するには`.gsub(検索文字列、キャプチャ()入り,'\1, \2')

  • matchメソッド (文字列)>MatchDataクラス): オブジェクト名.match(正規表現) 文字列の検索に用いる matchメソッドはMatchDataが格納され、pre_matchおよびpost_match メソッドでその前後の文字列を出力する

s = '2016-05-08'
if m = s.match(/(?<year>\d+)-(?<month>\d+)-(?<day>\d+)/)
  year  = m[:year]
  month = m[:month]
  day   = m[:day]
  puts "year: #{year}, month: #{month}, day: #{day}"
  # => year: 2016, month: 05, day: 08
end

mの中に3つのマッチデータが格納されていてハッシュと同じ方法で取得できる。

p m 
=> #<MatchData "2016-05-08" year:"2016" month:"05" day:"08">

次のような形も可能

s = '2016-05-08'
if /(?<year>\d+)-(?<month>\d+)-(?<day>\d+)/ =~ s
  # 名前付きキャプチャがそのままローカル変数になる
  puts "year: #{year}, month: #{month}, day: #{day}"
  # => year: 2016, month: 05, day: 08
end
  • プログラムの堅牢性 二つの対応するデータの運用は、配列よりもハッシュ、ハッシュよりもクラスの方がズレが生じにくい。

  • %w記法 %w()の中に値を入れる、スペースあけで配列を作る

irb(main):002:0> a = %w(bbb ccc)
=> ["bbb", "ccc"]
  • %W記法は式展開される (""のようなもの?)

  • q/Qはクオート,i/Iはシンボル(%sもシンボル)、%xはコマンド出力