2014-10-01から1ヶ月間の記事一覧
標準添付ライブラリ「set」を使う事で、集合を楽に扱う事ができます。 公式によると 集合とは重複のないオブジェクトの集まりです。 Array の持つ演算機能と Hash の高速な検索機能を合わせ持ちます。 との事なのでオブジェクトであれば何でも格納できます。…
文字列であれば、replaceメソッドを使って上書きする事ができます "s".replace "a" #=> "a" ところが、数値系クラスは破壊できません。 2.replace(4) ##NoMethodError: undefined method `replace' for 2:Fixnum 強引にやる場合、tapを使う手がありますが 2.…
可変変数の場合においては、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…
Rubinius : Use Ruby™ Rubinius : Use Ruby™ Runiniusは、RubyとLLVMによるRuby実装です。 聞いた所では、本家より高速だとか何とか・・・例えば、文字列こんな感じです。 rubinius/string.rb at master · rubinius/rubinius · GitHubeach_charやeach_byteの…
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, …
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を拡張する形で運用するExtensionを持っています。適用するには、インスタンスのexportメソッドで hash_instance.export Hashie::Extensions::ExtensionName とするなり、自作Hash拡張クラス内で class NewHash < Hash include Hashie::Exte…
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?(または#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に繋げる事で実現できます。 ブロックを渡す ブロックを渡すと、結果が真の場合ブロックの中身を実行してくれます。 真でない場合はnilを返します /(?<hrgn>\p{hiragana}+.*)/.match("ふ</hrgn>…
Regex#unionをつかうと、 Regexp.union(/dogs/, /cats/) #=> /(?-mix:dogs)|(?-mix:cats)/ と、”?-mix”とかいうよく分からない子がでてきます。 ?以降はキャプチャオプションの筈・・・ ためしにオプションをつけてみると Regexp.union(/dogs/m, /cats/i) #=…
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で複数条件がある正規表現の可視性を上げることができます 普通に引数 Regexp.union("skiing", "sledding") #=> /skiing|sledding/ バックスラッシュ記法なしで記号を楽に Regexp.union("a+b*c") #=> /a\+b\*c/ 文字列の配列わたす シンボルは駄…
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>…
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>
(1..4).each {|i| mtch = %r((\w{#{i}})); puts "hoge".gsub(mtch, $1)} TypeError: no implicit conversion of nil into Stringな、なんでや!? ブロックに入れてないときはちゃんと動いたのに!?こんな時は公式情報をみます。 すると・・・ 注意:第 2 引…
前日の記事の件、 帰路で冷静になって考え直した所・・・ そもそも正規表現でよいという、どうしようもない事実に気がつきました。というわけで 三文字目だけ変更するスクリプトは以下の通りです "hoghugapiyo".gsub(/(\w{2})(\w)(\w+)/, $1 + $2.upcase + $…
N文字目だけ文字を変更する場合には、String#[]とObject#instance_evalが使えます。例えば行頭だけ変えたい場合はこうします。 "hoge".instance_eval {|i| p i[0].upcase + i[1..-1]} #=>"Hoge" みんな大好きactive_supportを使うと、もう少し綺麗にかけます…
Rubyで分数を使う場合はRationalクラスを使います。 有り難い事に、floatな値であればto_rメソッドで変換できます。 (1.5).to_r #=> (3/2) (1.5).to_r + (0.5).to_r #=> (2/1) とはいえ、このままだと使い物にならないので値に変換します。 丸め込みならceil…
1859年の潜水艇―天才発明家モントゥリオールの数奇な人生作者: マシュースチュワート,Matthew Stewart,高津幸枝出版社/メーカー: ソニーマガジンズ発売日: 2005/09メディア: 単行本 クリック: 1回この商品を含むブログ (3件) を見るこの本はバルセロナの放っ…
UnboudMethodは、メソッド定義が先に来て、実体を後から渡します。 mtd = String.instance_method(:upcase) #=> #<UnboundMethod: String#upcase> mtd.bind("hoge").call #=> "HOGE" mtd.bind("gya").call #=> "GYA" あるいは、次の例のようにその時点のメソッド定義を退避させておき 後々</unboundmethod:>…
superは上位クラスの同名メソッドを呼び出すメソッドです。 これと、extendを組み合わせると、 極々たまにしか使わないけど凄く似てるメソッド の切り分けができます module Announce def next; "Next :: " << super << " !!"; end end => :next 必要なとき…
"==="は一般には"=="のエイリアスですが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メソッドが呼び出される(その1) - Bye Bye Moore 上記の記事は最初「引数のあたまに&をつけて呼び出せるのはProcとMethod」という題名書きましたところ…kuttya様から以下のようなコメントを頂きました。 kuttya ダックタ…
例の如くRubyで遊んでいた所、へんなクラスを見つけました。 Array.instance_method(:push) #=> #<UnboundMethod: Array#push> ...Methodクラスがでてくるもんだと思ってましたがUnboundとは一体...公式リファレンスを頼りにガチャガチャ弄り回した所、 bindメソッドを使う事でMethodク</unboundmethod:>…
最後の引数の直前に & がついている場合、 クラスのto_procメソッドで手続き オブジェクト(Proc)にコンバートされ渡されます。 というわけで (0..10).map &:next #=> [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11] なんて事ができるわけです。見方を変えれば、直前で…
32.method(:next) #=> #<Method: Fixnum(Integer)#next> と、Procのようにその場では実行されません。callで呼んであげれば実行されます 32.method(:next).call #=> 33 このメソッドをtapと組み合わせて使うと、以下のような禍々しい事もできてしまいます module Hoge def empty?(x, *xs) #</method:>…