2015-01-01から1年間の記事一覧

Ruby の class/module 定義式の戻り値

Ruby では class や module 定義も式なので戻り値があります。 class や module の定義式の戻り値は『最後に評価した式の結果』になります。 # 最後に評価式を返す # この場合は最後に定義したメソッドの戻り値を返す result = class X def method1 end def …

Ruby のメソッド定義式の戻り値

Ruby ではメソッドの定義(def)も式なので戻り値があります。 # メソッド定義の戻り値はメソッド名の Symbol name = def plus a, b a + b end p name # => :plus これって何かに利用できるのだろうか。 [おまけ] 式なので当然、以下のようなコードを記述す…

Ruby の break に引数を渡す

Ruby の break に引数を渡すと、そのループの戻り値になります。 data = [4, 2, 6, 7, 5, 3, 1, 8, 9] # 配列の中から最初に現れる奇数を探す result = for i in data if i % 2 != 0 break i end end result # => 7 # #each でも利用できる result = data.ea…

Ruby で #each_with_self を書いてみた

これを簡単に書けるようにしてみたくて書いてみた。 class Enumerator def with_self &block with_object self, &block end end module Enumerable def each_with_self &block each_with_object self, &block end end [1, 2, 3].each_with_self { |it, mysel…

Ruby で block 内からレシーバのオブジェクトを参照したかった

意図としては以下のように block 内で呼び出したレシーバを参照したい。 [1, 2, 3].map { |it| it + self.size # block 内でレシーバのオブジェクトを参照したい } # => [4, 5, 6] しかし、block 内のスコープでメソッドやオブジェクトを参照した場合、定義…

ユーザ定義リテラル(と Sprout)を利用してテンプレート引数に float 値を渡す

C++

さて、テンプレート引数には int 型等の整数値を直接渡すことはできますが、float 値を直接渡すことはできません。 // こういう風に float 値を受け取ることはできない template<float F> struct X{ ... }; こういう場合、std::ratio みたいに分子と分母に分けて整数</float>…

C/C++ で予約済み識別子をシンタックスハイライトするプラグインつくった

他人の書いた C/C++ のコードを見ているとあまりにも予約済み識別子を無視してコードを書いているものが多いので、ついカッとなってつくった。 プラグイン osyo-manga/vim-cpp-syntax-reserved_identifiers NeoBundle 'osyo-manga/vim-cpp-syntax-reserved_i…

Google 日本語入力の Godan を使ってみた所感

元々スマホではケータイ配列でフリック入力を使っていたんですが、最近どうにも Google 日本語入力が重すぎてレスポンスがめちゃくちゃ悪い(特に濁点の入力が半分ぐらいの確率で入力されない)ので Godan という入力方法を試してみました。 Godan について…

Ruby の Enumerable#each_with_index で index の初期値を指定する

Enumerable#each_with_index を利用すると index を付属してループする事ができます。 ["homu", "mami", "mado"].each_with_index { |it, i| puts "#{i} : #{it}" } # => 0 : homu # 1 : mami # 2 : mado index の初期値を指定してループする index の初期値…

Ruby では空白を間に挟んだ文字列リテラルは結合される

例えば、次のように空白を挟んだ文字列リテラルを連続で記述した場合、それは1つの文字列として結合されます。 # 空白を挟んで定義すると1つの文字列として結合される s = "homu" "mami" "mado" # => "homumamimado" # こういう風に書いても結合される ss = …

Ruby の Enumerable#each_with_index を自前で実装してみた

Enumerable#each_with_index の実装がどうなっているのか知りたかったんですが、どうやら C で書かれているようなので自分で Ruby を使った実装を書いてみた。 module Enumerable def each_with_index2 &block if block_given? index = 0 each { |it| block.…

Ruby で引数に配列を受け取る際の受け取り方いろいろ

Hash#map の引数の受け取り方で悩んでたんですが、つまりこういう事か。 # ブロックに配列を渡す def test &block block.call [1, 2, 3] end # 引数がひとつだけの場合はそのまま配列になる test { |a| p a # => [1, 2, 3] } # 配列の要素数よりも引数が少な…

Ruby の iolite を Hash#map に渡す場合の注意

さて、iolite を利用するとブロックを抽象的に記述する事ができるのですが、Hash#map に渡すときに注意する必要があります。 例えば、 homu = { "name" => "homu", "age" => "14"} # これを iolite を使って抽象化したい homu.map { |key, value| key + " : …

Ruby の Hash#map に渡すブロックは引数の数によって受け取り方が異なる

Hash#map は渡したブロックの引数の数によって受け取り方が異なります。 homu = { name: :homu, age: 14 } # 引数が2つの場合はキーと値が別々に渡される homu.map { |key, value| "#{key} : #{value}" } # => ["name : homu", "age : 14"] # 引数が1つの場…

MacBook Air を触ってみた所感

まだ全然触れてないのでハード面の所感。 薄いので蓋が開けづらい 電源コードが太い トラックパッドがむずい キーボードがUS配列 薄い MBA には何回か触ってみたことはあるんですがやっぱり薄いですね。あと軽い。 ただ、薄さを重視している成果ディスプレイ…

Ruby の Array#* は Array#join と同等

知らなかった。 data = ["homu", "mami", "mado"] data * " + " # => "homu + mami + mado" 便利そうではあるのだけれど多用するのはなんか微妙な気もする。

某氏から MacBook Air を譲ってもらった

もう使ってないということで某氏から MacBook Air を譲ってもらいました!!ありがとうございます!! これで MacVim 勢の仲間入りです なお、US配列で無事死亡した模様。

Ruby で動的にメソッドを定義する

Ruby で動的にメソッドを定義したい場合、#define_method を利用する事ができます。 def create_method name define_method name do name end end create_method "homu" create_method "mami" homu # => "homu" mami # => "mami" Ruby でメタプログラミング…

Ruby でスペースや記号が含まれている名前でメソッドを定義する

Ruby でメソッドを定義する場合、名前には識別子(英数字+`)と再定義可能な演算子のみ使用する事ができます。 しかし、define_method` メソッドを使用するとスペースや記号を含んだ名前のメソッドを定義する事ができます。 class X # #define_method を使用し…

C++11 以降で using を使って配列型を別名で定義

C++

Twitter でみかけたんですが、こういう使い方もできるんだなーと。 C++03 では以下のように typedef を使って配列型を別名で定義することができます。 // int[5] の配列を int5 という名前で定義 typedef int int5[5]; int5 members = {0, 1, 2, 3, 4}; 関数…

Ruby でメソッド名から Proc オブジェクトを生成する

#method を使うとレシーバのメソッドを Proc オブジェクトとして生成する事ができます。 class X def class_name "class X" end end x = X.new # メソッド名を渡すとそのメソッドを呼び出す Proc オブジェクトを返す class_name = x.method :class_name clas…

Ruby で可変長引数の Proc オブジェクトをカリー化する

可変長引数を受け取る Proc オブジェクトをカリー化する場合、#curry メソッドに対して任意の引数数を指定する事ができます。 sum = proc { |*args| args.inject :+ } # #curry に対して引数の数を渡す # 引数を2つ受け取ったら評価する p sum.curry(2).(1).…

Ruby でカリー化

Ruby では #curry で Proc オブジェクトをカリー化する事ができます。 plus = proc { |a, b, c| a + b + c } # 第一引数に 3 を渡した状態の Proc オブジェクトを返す plus3 = plus.curry.call 3 # 引数分の数が渡されたらブロックの結果が返ってくる plus3.…

Ruby でクラスのメソッドをあとから拡張する

例えば、任意のファイルのパーサをあとから実装して追加したい場合に Ruby だとどういう風に書くのがいいかなーと考えてみた。 class ParserFile def parse name "Failed" end end module ParserCPP def parse name if name =~ /\.cpp$/ "C++ file" else sup…

Ruby の #== と #=== の違い

Ruby には比較演算子 #== の他にも #=== という演算子を定義する事ができます。 ここから #=== について引用すると メソッド Object#== の別名です。 case 式で使用されます。このメソッドは case 式での振る舞いを考慮して、 各クラスの性質に合わせて再定…

Ruby の Proc オブジェクトの評価方法まとめ

Ruby の Proc オブジェクトを評価する場合、いくつかのメソッドが用意されているのでまとめてみました。 proc = Proc.new { |it| 42 + it } proc.call 1 # => 43 proc[2] # => 44 proc === 3 # => 45 proc.yield 4 # => 46 #call, #[], #===, #yield の4つの…

Ruby で複数のヒアドキュメントを記述する

次のようにして複数のヒアドキュメントを記述する事ができます。 def join *args p args args.join end p join(<<EOS1, <<EOS2, <<EOS3) homu mami EOS1 mado EOS2 saya an EOS3 # => ["homu\nmami\n", "mado\n", "saya\nan\n"] # "homu\nmami\nmado\nsaya\nan\n" 2個目のヒアドキュメントは1個目の終了ラベル以降が反映される</eos1,>…

Ruby のヒアドキュメントの開始ラベルは式

Ruby のヒアドキュメントの開始ラベルは式になります。 なので、例えばメソッドを呼び出す場合は次のように開始ラベルをレシーバとして呼び出す事ができます。 <<EOS.split("\n").grep(/m/) homu mami saya EOS # => ["homu", "mami"] また、次のように開始ラベルをメソッドの引数に渡すことができます。 def tw</eos.split("\n").grep(/m/)>…

Vim の単語を対象とするテキストオブジェクトを使い分ける

Vim

さて、Vim で単語を選択するテキストオブジェクトといえば iw や aw ですが、わたしは他にもいくつかの『単語を選択する』テキストオブジェクトを使い分けています。 そもそも iw とは iw や aw は『カーソル下の単語』を対象とするテキストオブジェクトにな…

jplus.vim に空の文字が入力された時の設定を追加できるようにした

Vim

元々は g:jplus#input_config に入力された文字をキーとした辞書を設定してカスタマイズできるようになっているんですが、これだと空の文字が入力された時の設定ができなかったので特別なキーワードを設定できるようにしました。 " 空の文字が入力された場合…