2014-11-01から1ヶ月間の記事一覧
今まで良く理解せずに使っていたのですが…Ruby2.0以上から導入されたキーワード引数は相当強化されていたようです。例えば、 def comment( date: TIme.now, msg, user: "UNKNOWN") #{user} said: #{msg} [date] end と書くと、本体で一々初期値を使うための…
「ロンドン貧乏物語」はヴィクトリア時代の呼売商人(要はその日暮らしに近い零細商人)のお話を集めた本です。*1 今でいうところのノンフィクションにあたる内容で、「パックスブリタニカ」と呼ばれる黄金時代の英国における彼ら彼女らの姿を生々しく記録し…
次のような、何やらジゴクめいた数の内部変数を持ったクラスメソッドがあったとします。 class Hoge def set_unit_price(val, power, speed, mp) special_param = power * speed * val magic_param = mp * speed * 13 if val > 10 unit_price = special_para…
個人的によくやりがちな実装法なのでメモ。メソッドにパラメータを渡し、case文やif-else文で実行コードを分岐させるような実装は、 以下のよな手順でリファクタリングできます。 例 class TestClass def self.create_member(type) case type when :admin Ad…
正規表現におけるアンカーの一つ、\bは単語の境界にマッチします。 単語の両端を括れば、前後に余計な文字が入っているものを除外できます。 /foobar/.match("foobarii") #=> #<MatchData "foobar"> /\bfoobar\b/.match("foobarii") #=> nil ・・・では、この単語の境界ってナン</matchdata>…
正規表現で0個以上系の量指定を使うときにはちょいと注意が必要です。 基本、*はゼロ個以上 ""io899hoge".match /(\d*)hoge/ #=> #<MatchData "899hoge" 1:"899"> ?は0または1個のマッチに対応します。 "io899hoge".match /(\d?)hoge/ #=> #<MatchData "9hoge" 1:"9"> ところが・・・ 例えば「iohoge」という文</matchdata></matchdata>…
Make Faire Tokyo 2014 レポート 毎年恒例のMake Faire Tokyo(MFT)、今年も行ってきました。 なんと、今回は東京ビッグサイトでの開催です! 異様にクオリティの高い展示 今回、個人的に気になったのは展示の魅せ方が上手いとこが多かったように感じます。…
instance_evalにブロックとしてメソッドをわたすと、上から順繰りに実行して あたかもメソッドチェインかのように振舞います。ただし、連続して実行するだけなので "1234-5678-9123-4567".instance_exec do sub(/\d+/,'*' * 4) sub(/\d+/,'*' * 4) sub(/\d+/…
前の記事の続きです。 肯定前方読みという、やや特殊な正規表現の記法を使うと「最後だけ除く」といった If文が必要となりそうな話も一行で書く事ができます。 たとえばクレジットカードの認証なんかで良くある、「末尾4桁だけは表示する」ような仕組みの場…
病気・ケガをしたけど意識がハッキリしていて救急車呼ぶほどでは・・・というケースでは 救急相談センターの利用がオススメです。 基本番号は「#7119」で、地区毎に個別番号があります受け付けているケースは 救急相談センターの主なサービス ○症状に基…
考えてみれば当たり前なのですが 文字列を配列を見立てれば、番号指定で切り詰める事ができます。 "hogefugapiyo"[0..5] #=> "hogefu" 日本語もこの通り。 "今日は晴れ"[0..3] #=> "今日は晴" 入力はN文字まで! なんてケースでも、一々正規表現で拾いに行か…
Active_supportのString#squishで邪魔な改行文字や空白を綺麗にできます。つまり、これが puts "\n HOGE \r\n fuga" # HOGE # fuga こうなります。 puts "\n HOGE \r\n fuga".squish #HOGE fuga 実装上の話 もちろん、正規表現なんかでもいけます 実際、実装…
in_groups_ofは配列を指定個数ごとに切り分けてくれるメソッドです (1..10).to_a.in_groups_of(3) #=> [[1, 2, 3], [4, 5, 6], [7, 8, 9], [10, nil, nil]] 空白を任意の値で埋める事もできます (1..10).to_a.in_groups_of(3,42) #=> [[1, 2, 3], [4, 5, 6],…
Active_support提供のEnumerable#sumで合算時に楽をできるメソッドです 使い方 [1,2,3].sum #=> 6 (1..100).sum #=> 5050 ブロックを渡して、ちょっと入り組んだ合算をやる事も可能です。 下の例では、各要素の二倍を合算する例を挙げています。 (1..2).sum …
Object#dupとObject#cloneはオブジェクトをコピーします obj = ["a","b","c"] #=> ["a", "b", "c"] obj_d = obj.dup => ["a", "b", "c"] obj_d[0] << "PLUS" => "aPLUS" obj => ["aPLUS", "b", "c"] obj_d => ["aPLUS", "b", "c"] obj[1] = "HOGE" => "HOGE"…
Enumerable#reverse_eachは逆回しのeachができるメソッドです。 [1,2,3].reverse_each {|i| puts i * 4} 12 8 4 #=> [1, 2, 3] reverseでメソッドチェインする時と違い、返ってくる配列はもとのままです。 [1,2,3].reverse.each {|i| puts i * 4} 12 8 4 => …
Enumerable#flat_mapは各要素をブロックに渡し、その返り値を連結した配列を返すメソッドです。 通常のmapなら ['ab','cd','ef'].map(&:chars) #=> [["a", "b"], ["c", "d"], ["e", "f"]] となるところを、 ['ab','cd','ef'].flat_map(&:chars) #=> ["a", "b…
Enumerator#rewindは要素を最初まで巻き戻すメソッドです。 ary = %w(a b c).each #=> #<Enumerator: ...> ary.next #=> "a" ary.next #=> "b" ary.rewind #=> #<Enumerator: ...> ary.next #=> "a" 同名のメソッドはFileクラスにも用意されており、これはファイルの先頭に戻るメソッドのようで</enumerator:></enumerator:>…
立て続けにヤバさみ案件が続いたのでメモ。欧州の輸出入管理まわりと郵便局は信用ならないようです。 ネットで見ても、政府系の海外販路支援の先生方にしても先方の官僚機構は信用するなとの声がポツポツと。 なんでそんな話が出るのかなーなんて惚けていま…
ちょっと前にやったPOSIX 文字クラスですが、これらはRubyでも活用できます。 [:alnum:] 英数字 (Letter | Mark | Decimal_Number) [:alpha:] 英字 (Letter | Mark) [:ascii:] ASCIIに含まれる文字 (0000 - 007F) [:blank:] スペースとタブ (Space_Separator…
countは、条件に一致する文字(or要素)の個数を数え上げるメソッドです。 Stringや "Si Vis Pacem, Para Bellum".count("A-Z") #=> 5 引数は複数指定できますがAND条件なので注意して下さい。 "Si Vis Pacem, Para Bellum".count("A-Z","i") #=> 0 少し複雑…
戦争と広告作者: 馬場マコト出版社/メーカー: 白水社発売日: 2010/09/18メディア: 単行本購入: 1人 クリック: 55回この商品を含むブログ (8件) を見る太平洋戦争時代の日本広告業にフォーカスした内容です。 プロジェクトX的な群像劇形式の冊子となっていま…
Array#sampleは、配列からランダムに要素を引っ張り出すメソッドです。 実は以前の記事でちょっと触れたのですが、理解が深まったのでメモ。 用途 何もつけなければ、一個の要素をランダムに抽出します。 (1..99).to_a.sample #=> 36 (1..99).to_a.sample #=…
文字列を配列として切り分けるsplitメソッドですが、 引数を工夫する事でロジック簡略化に貢献することができます。 正規表現を使う 第一引数には、文字列以外にも正規表現を使う事ができます。 "hoge 123 Jaga 太郎".split(/\s*/) => ["h", "o", "g", "e", …
コードリーディング中に久々にforを見かけたのでメモします。Rubyにもfor文による繰り返し表現があります。 たとえば、多重配列を弄るには以下のようにします。 for first, second, third in [[1,2,3],[4,5,6],[7,8,9]] puts first, second, third end これ…
Rangeを使う際に便利なメソッド集です。 最初と最後を取る (1..9).first #=> 1 (1..9).last #=> 9 長さを取る (6..9).size #=> 4 含まれているか調べる 似たメソッドですが、比較手法が違います。 coverは、include?は ===です。 後者はcaseで活用されます。…
数値のsizeをとると、実装上のバイト数が返ってきます。 2056.size #=> 8 0x100_000_000_000_000_000.size #=> 9 0x1_000_000_000_000_000_000.size #=> 10 誤爆して「8」とだけ出たので何事かと思いましたが・・・ displayといい、時折用途がよくわからな…
Stringにはscanというフレーズ抽出メソッドが備わっています。 一致条件には正規表現を使う事ができるため、数値だけ…みたいな用途にも使えます。 結果は配列で帰ってくるので便利です。 配列に切り分けてからブロックでGrepとか芋臭いことしなくて良いんだ…
Enumerable#to_setを使うと、既存のEnumerableインスタンスをsetクラスに変換する事ができます。 [{name: :shuzo, power: 10},{name: :vivit, power: 20}].to_set #=> #<Set: {{:name=>:shuzo, :power=>10}, {:name=>:vivit, :power=>20}}> ブロックを渡して加工する事もで</set:>…
setはEnumerableです。 そのため、selectやらmapやらも難なく行けます set.select{|i| i.name == "shuzo"} #=> [{"power"=>10, "name"=>"shuzo"}] set.map{|i| i.name } #=> ["shuzo", "vivit"] lazyもイケます。 大量に使う場合には良いかもしれません set.…