Bye Bye Moore

PoCソルジャーな零細事業主が作業メモを残すブログ

2014-10-01から1ヶ月間の記事一覧

標準ライブラリ「set」で集合を扱う(その1)

標準添付ライブラリ「set」を使う事で、集合を楽に扱う事ができます。 公式によると 集合とは重複のないオブジェクトの集まりです。 Array の持つ演算機能と Hash の高速な検索機能を合わせ持ちます。 との事なのでオブジェクトであれば何でも格納できます。…

Rubyの数値は破壊できない

文字列であれば、replaceメソッドを使って上書きする事ができます "s".replace "a" #=> "a" ところが、数値系クラスは破壊できません。 2.replace(4) ##NoMethodError: undefined method `replace' for 2:Fixnum 強引にやる場合、tapを使う手がありますが 2.…

可変変数の場合におけるprocとlambdaの差

可変変数の場合においては、procよりlambdaの方が変数チェックが厳密です procの場合 hoge = proc {|x, *w| (x||0) + w.inject(0,&:+)} hoge.curry(0)[1,2,3] => 6 lambdaの場合 hoge = lambda {|x, *w| (x||0) + w.inject(0,&:+)} hoge.curry(0)[1,2,3] ##A…

ブロックやラムダを使った再帰表現のお勉強

ブロックやラムダ式を使った再帰表現のお勉強をしてみました。 なお、以下の例はどれもinjectでやった方が早い例です。 Hashie::Extensions#deep_find_allの場合 module Hashie module Extensions module DeepFind def deep_find_all(key) matches = _deep_f…

RubyによるRuby実装「Runinius」でRubyの挙動を学ぶ

Rubinius : Use Ruby™ Rubinius : Use Ruby™ Runiniusは、RubyとLLVMによるRuby実装です。 聞いた所では、本家より高速だとか何とか・・・例えば、文字列こんな感じです。 rubinius/string.rb at master · rubinius/rubinius · GitHubeach_charやeach_byteの…

hashieでHash型を便利に拡張する(その4_Dashで入力ルールを定める)

DashはHashに対して入力ルールを定める拡張です。 class User < Hashie::Dash property :name, required: true property :type, default: :normal end shuzo = User.new(name: :Shuzo) #=> {:type=>:normal, :name=>:Shuzo} vivit = User.new(name: :Vivit, …

hashieでHash型を便利に拡張する(その3_Clashでメソッドチェイン風にデータ入力)

Clashはメソッドチェインでハッシュを生成できるという、素敵拡張です。 Clash is a Chainable Lazy Hash that allows you to easily construct complex hashes using method notation chaining. つかいかた 基本 c = Hashie::Clash.new c.where( abc: :aiu,…

hashieでHash型を便利に拡張する(その2_DeepFind)

Hashieは既存Hashを拡張する形で運用するExtensionを持っています。適用するには、インスタンスのexportメソッドで hash_instance.export Hashie::Extensions::ExtensionName とするなり、自作Hash拡張クラス内で class NewHash < Hash include Hashie::Exte…

hashieでHash型を便利に拡張する(その1_導入編)

hashieというgemをつかうと、Hash型を拡張して色々便利な事ができます。 mash = Hashie::Mash.new #=> {} mash.length #=> 0 mash.name #=> nil mash.name? #=> false mash.name = :shuzo_kino #=> :shuzo_kino mash.name #=> :shuzo_kino こういうモノはデ…

Object#is_a?(Object#kind_of?)の使い方

Object#is_a?(または#kind_of?)はサブクラスも含めたクラスのインスタンスか否かを判定します。どちらもboolで結果を返します。事前に、こんな関係でクラスを作っておくと・・・ class A; end class B < A; end is_a?の場合 A.new.is_a? B #=> false B.new…

正規表現をキャプチャせずグループ化する

/^(?:([AE][0-9]{7})|(IN:\g<1>Q))$/ という正規表現に対しては "J0125556" "IN:E0123463Q" という文字列がマッチします。 「(?:pat)」というグループ化しない記法で囲んでおくとキャプチャが作成されず一寸だけ性能が増します。 /^(?:([AE][0-9]{7})|(IN:\g…

Regex#matchに続けてメソッドチェインをしたい場合、ブロックを渡すか、tapに繋げる

Regex#matchに続けてメソッドチェインをしたい場合、 ブロックを渡すか、tapに繋げる事で実現できます。 ブロックを渡す ブロックを渡すと、結果が真の場合ブロックの中身を実行してくれます。 真でない場合はnilを返します /(?<hrgn>\p{hiragana}+.*)/.match("ふ</hrgn>…

Regex#unionで返ってくる”?-mix”て何よ?という話

Regex#unionをつかうと、 Regexp.union(/dogs/, /cats/) #=> /(?-mix:dogs)|(?-mix:cats)/ と、”?-mix”とかいうよく分からない子がでてきます。 ?以降はキャプチャオプションの筈・・・ ためしにオプションをつけてみると Regexp.union(/dogs/m, /cats/i) #=…

正規表現のCharacter Propertiesで通貨や平仮名、ラテン語までキャッチする

Character Propertiesをつかうと、 平仮名や片仮名、果ては通貨記号までキャッチする事が出来ます /\p{hiragana}+/.match "ほげpiyoふが" #=> #<MatchData "ほげ"> /\p{Sc}+/.match "¥120,000." #=> #<MatchData "¥"> /\p{Sc}+/.match "$1,123." #=> #<MatchData "$"> /\p{Sc}+/.match "130,000₫" #=> #<MatchData "₫"> 残念</matchdata></matchdata></matchdata></matchdata>…

Regex#unionで複数条件がある正規表現の可視性を上げる

Regex#unionで複数条件がある正規表現の可視性を上げることができます 普通に引数 Regexp.union("skiing", "sledding") #=> /skiing|sledding/ バックスラッシュ記法なしで記号を楽に Regexp.union("a+b*c") #=> /a\+b\*c/ 文字列の配列わたす シンボルは駄…

compileメソッドを使って複雑に入り組んだ正規表現を記述する

Regex#compileは複雑な正規表現を記述する際大活躍するメソッドです 以下のような順で引数をとります compile(string, option = nil, code = nil) このうち、optionを生かすと r = Regexp.compile "ge.+pi", Regexp::MULTILINE #=> /ge.+pi/m str = "hoge\nh…

正規表現の後方読み

Rubyにも、後方一致というオプションがついてます。 これを使うと、特定パターンに続く文字列を抽出する事が可能となります /(?<=<b>)\w+(?=<\/b>)/.match("Fortune favours the <b>bold</b>") # => #<MatchData "bold"> 参考もと 正規表現 ruby - Is there any way to shorten this regu</matchdata></b>…

名前付きキャプチャを使って、正規表現の結果をHash気分で扱う

Rubyにはperlと同様、名前付きキャプチャがあります。 キャプチャ (?pat)もしくは(?'name'pat)で書き下します。 "ブリドカットセーラ 恵美".match(/(?<family_name>\S+)[ |\s]+(?<given_name>\S+)/) #=> #<MatchData "ブリドカットセーラ 恵美" family_name:"ブリドカットセーラ" given_name:"恵美"> "上坂 すみれ".match(/(?<family_name>\S+)[ |\s]+(?<given_name>\S+)/) #=> #</given_name></family_name></matchdata></given_name></family_name>

gsubの第二引数に特殊変数「$1」を仕込んでも動作しない場合、ブロックわたしに変更する

(1..4).each {|i| mtch = %r((\w{#{i}})); puts "hoge".gsub(mtch, $1)} TypeError: no implicit conversion of nil into Stringな、なんでや!? ブロックに入れてないときはちゃんと動いたのに!?こんな時は公式情報をみます。 すると・・・ 注意:第 2 引…

N文字目だけ破壊的に大文字へ変更する(正規表現編)

前日の記事の件、 帰路で冷静になって考え直した所・・・ そもそも正規表現でよいという、どうしようもない事実に気がつきました。というわけで 三文字目だけ変更するスクリプトは以下の通りです "hoghugapiyo".gsub(/(\w{2})(\w)(\w+)/, $1 + $2.upcase + $…

N文字目だけ破壊的に大文字へ変更する

N文字目だけ文字を変更する場合には、String#[]とObject#instance_evalが使えます。例えば行頭だけ変えたい場合はこうします。 "hoge".instance_eval {|i| p i[0].upcase + i[1..-1]} #=>"Hoge" みんな大好きactive_supportを使うと、もう少し綺麗にかけます…

分数を扱えるRationalクラスについて

Rubyで分数を使う場合はRationalクラスを使います。 有り難い事に、floatな値であればto_rメソッドで変換できます。 (1.5).to_r #=> (3/2) (1.5).to_r + (0.5).to_r #=> (2/1) とはいえ、このままだと使い物にならないので値に変換します。 丸め込みならceil…

【読書メモ】1859年の潜水艇―天才発明家モントゥリオールの数奇な人生

1859年の潜水艇―天才発明家モントゥリオールの数奇な人生作者: マシュースチュワート,Matthew Stewart,高津幸枝出版社/メーカー: ソニーマガジンズ発売日: 2005/09メディア: 単行本 クリック: 1回この商品を含むブログ (3件) を見るこの本はバルセロナの放っ…

UnboundMethodという奇怪なクラスについて(その2)

UnboudMethodは、メソッド定義が先に来て、実体を後から渡します。 mtd = String.instance_method(:upcase) #=> #<UnboundMethod: String#upcase> mtd.bind("hoge").call #=> "HOGE" mtd.bind("gya").call #=> "GYA" あるいは、次の例のようにその時点のメソッド定義を退避させておき 後々</unboundmethod:>…

たまにしか使わないけど微妙に似てるメソッドはmoduleに切り分け

superは上位クラスの同名メソッドを呼び出すメソッドです。 これと、extendを組み合わせると、 極々たまにしか使わないけど凄く似てるメソッド の切り分けができます module Announce def next; "Next :: " << super << " !!"; end end => :next 必要なとき…

caseの条件式にprocを渡す

"==="は一般には"=="のエイリアスですがProcの場合はcallのような役割を果たします :to_i.to_proc === "21" これを生かすと、case文を以下のような感じで書く事ができます p mu #<MyUnit:0x007f963ab80330 @power=12, @speed=4, @hp=100> def strong? proc {|i| i.power > 15} end case mu when strong? ##something</myunit:0x007f963ab80330>…

引数のあたまに&をつけるとto_procメソッドが呼び出される(その2)

引数のあたまに&をつけるとto_procメソッドが呼び出される(その1) - Bye Bye Moore 上記の記事は最初「引数のあたまに&をつけて呼び出せるのはProcとMethod」という題名書きましたところ…kuttya様から以下のようなコメントを頂きました。 kuttya ダックタ…

UnboundMethodという奇怪なクラスについて

例の如くRubyで遊んでいた所、へんなクラスを見つけました。 Array.instance_method(:push) #=> #<UnboundMethod: Array#push> ...Methodクラスがでてくるもんだと思ってましたがUnboundとは一体...公式リファレンスを頼りにガチャガチャ弄り回した所、 bindメソッドを使う事でMethodク</unboundmethod:>…

引数のあたまに&をつけるとto_procメソッドが呼び出される(その1)

最後の引数の直前に & がついている場合、 クラスのto_procメソッドで手続き オブジェクト(Proc)にコンバートされ渡されます。 というわけで (0..10).map &:next #=> [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11] なんて事ができるわけです。見方を変えれば、直前で…

Object#methodでMethodオブジェクトを得る

32.method(:next) #=> #<Method: Fixnum(Integer)#next> と、Procのようにその場では実行されません。callで呼んであげれば実行されます 32.method(:next).call #=> 33 このメソッドをtapと組み合わせて使うと、以下のような禍々しい事もできてしまいます module Hoge def empty?(x, *xs) #</method:>…