2015-07-01から1ヶ月間の記事一覧

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 に入力された文字をキーとした辞書を設定してカスタマイズできるようになっているんですが、これだと空の文字が入力された時の設定ができなかったので特別なキーワードを設定できるようにしました。 " 空の文字が入力された場合…

Ruby のブロック内でスコープの外と同じ名前の変数を上書きせずに定義する

例えば、次のようにブロックスコープ内でスコープの外にある名前の変数を使った場合、変数の中身は上書きされてしまいます。 value = "homu" twice = Proc.new { |it| value = it value + value } twice.call 10 # => 20 value # => 10 まぁこれは当然ですね…

C++ のライブラリを読むときに見るところ

C++

そこまで頻繁に読んでるわけではないのですが、たまーに C++ のライブラリを読んだりしています。 そんな時にわたしが特に注意している点を簡単にまとめて見ました。 予約済み識別子を意識してるか C++ では以下の条件を満たす名前は将来的に予約語になる可…

Ruby のヒアドキュメントの文字列を操作する

例えば、ヒアドキュメントから末尾の改行コードを取り除く場合、 str = <<EOS homu mami mado EOS p str.chomp # => "homu\nmami\nmado" こんな感じに一時的に変数に代入して操作するしか無いと思ってました。 開始ラベルをレシーバとしてメソッドを呼び出す 開始ラベルをレシーバとしてメソッドを呼</eos>…

Ruby の private メソッドを外部から呼び出す

[関連] Ruby の private メソッドとは - Secret Garden(Instrumental) さて、Ruby の private メソッドは『レシーバをつけて呼び出すことができない』という仕様です。 なので、本来であれば『メソッドを外から呼び出す場合はレシーバをつける必要がある』の…

CLI から Wandbox を利用してソースファイルを実行する gem をつくった

Web からプログラミングのソースコードを実行できる Wandbox というサイトがあるんですが、それの API を利用してプログラミング環境がなくても CLI からソースファイルを実行する事ができる CLI ツールをつくりました。 インストール $ gem install wandbox…

jplus.vim で行結合するときに &formatoptions に依存してコメントリーダーを削除するようになった

Vim

[関連] jplus.vim でコメントリーダーを削除して結合する - Secret Garden(Instrumental) 以前、コメントリーダーを削除して行結合する設定を書いたのですが、NigoroJr さんから pull request もらって formatoptions+=j されていれば自動的にコメントリーダ…

Vim で J で行結合するときにコメントリーダーを削除して結合する

Vim

set formatoptions+=j と、いうように 'formatoptions' に j を追加すると J で行結合する際にコメントリーダーを削除して結合されます。 これは例えば、 # aaa # bbb というコメントを結合した場合に # aaa bbb と、いう風に結合されます。

clang の定義済みマクロを取得する

C++

clang の定義済みマクロを取得したい場合、次のコマンドで出力する事ができます。 $ clang -dM -E -x c++ /dev/null [出力結果] #define _GNU_SOURCE 1 #define _LP64 1 #define __ATOMIC_ACQUIRE 2 #define __ATOMIC_ACQ_REL 4 #define __ATOMIC_CONSUME 1 …

Vim で使っていない機能まとめ

Vim

某所でそんな話題になったのでパッと思いついたのをまとめてみた。 マクロ マーク レジスタ ctags 系 とりあえず『知ってるけど使いどころがわからなくて使ってない』という機能を上げてみた。 マクロとかいまいちどういう時に便利なのかよくわからなかった…

Ruby で条件付きの最大値、最小値を取得する

#max_by と #min_by を使用します。 ["homuhomu", "an", "mado"].max_by { |it| it.length} # => "homuhomu" 最初 #max 使っててなんで動作しないのかと悩んでた…。

jplus.vim でコメントリーダーを削除して結合する

Vim

関連 formatoptions+=j でコメントリーダーが削除されない · Issue #6 · osyo-manga/vim-jplus · GitHub 確かに formatoptions は全く考慮していなかったなーと。 とりあえず、現状は以下のように g:jplus#config を設定すれば『コメントリーダーを削除して…

Ruby で #to_s を定義しないで標準出力をカスタマイズする

前回は #to_s を定義して標準出力をカスタマイズしたのですが、#to_s を定義しないで標準出力をカスタマイズしてみました。 [コード] # #to_stdout が定義されていればその戻り値を標準出力する module Output def puts output if output.respond_to? :to_st…

Ruby で JSON ⇔ Hash の相互変換

いつも忘れるので覚書 [Hash → JSON] Hash#to_json を使います。 require "json" dict = {name: :homu, age: 14} dict.to_json # = > "{\"name\":\"homu\",\"age\":14}" [JSON → Hash] JSON.parse を使います。 require "json" json = '{ "name" : "homu", "…

Ruby で include 後に prepend を行っても反映されない

当たり前といえば当たり前な気もするけど…。 Ruby で #prepend を呼び出しても反映されなくてハマった。 どういうことかというとこういうこと。 module A def func puts "A" super end end module B def func puts "B" end end include B # include よりもあ…

Ruby でユーザクラスの標準出力をカスタマイズする

Ruby ではオブジェクトを出力する場合、 #to_s が出力されるのでそれを利用する。 class Person def initialize name, age @name, @age = name, age end def to_s "name : #{@name}, age : #{@age}" end end homu = Person.new "homu", 14 puts homu # => na…

Ruby で再定義できない演算子

Ruby では以下の演算子は再定義することはできません。 = ?: .. ... not && and || or :: 代入演算子や条件演算子はともかく、&& や || もユーザ側では再定義することはできません。 ここら辺は地味にツラい(iolite 的な意味で

col-sm-3 みたいなときにマイナスを無視してインクリメント・デクリメントする Vim プラグインつくった

Vim

久々に Vim script 書いた気がする。 [関連] Vimの<C-a>と<C-x>にマイナスを無視するオプションがほしい…(Bootstrapのcol-sm-3)とかで負数扱いされて逆になるのつらい— Pocke(ぽっけ) (@p_ck_) 2015, 7月 6 なんか需要ありそうだし、自分も欲しかったので以前作ったこ</c-x></c-a>…

Ruby で単項演算子を再定義する

Ruby で単項演算子、+``- を再定義する場合、メソッド名を +@``-@ にすることで再定義する事ができます。 class X def initialize value @value = value end # 単項演算子 - を再定義 def -@ -@value end end x = X.new -10 -x # => 10

Ruby で代入演算子を含むメソッド

Ruby では、メソッド名の末尾に = を追加することで代入式のようなメソッドを定義する事ができる。 class X # メソッド名の末尾に = をつける def value= value @value = value end def value @value end end x = X.new # 代入式のようにメソッドを呼び出す…

Ruby の演算子はメソッド

Ruby では + や -、&、| といった二項演算子などはメソッド呼び出しになる。 例えば、 a + b という式は a.+(b) というメソッド呼び出しのシンタックスシュガーになる。 また、これらの演算子(メソッド)はユーザ側で再定義することができるので、任意のクラ…

Ruby の private メソッドは継承先からでも呼び出すことができる

Ruby の private メソッドは『レシーバをつけて呼び出すことができない』という仕様です。 逆にいえば、『レシーバをつけないで呼び出す事ができれば、定義したクラス以外からも private メソッドは呼び出す事ができる』ということになる。 例えば private …

vimshell で標準出力のハイライトを無効にする

Vim

だいたい Vim の conceal 機能がクソなのが原因なのですが、vimshell では Vim の conceal を使って標準出力のハイライトを行っています。 しかし、conceal を使うと色々と副作用(カーソル移動が conceal を考慮されなかったり、や折り返しがおかしくなった…

Ruby の private メソッドとは

Ruby の private メソッドとは『レシーバをつけて呼び出すことができない』メソッドのことである。 Ruby の private メソッドは Module の #private を使用することで以降に定義したメソッドを private メソッドとして定義する事ができる。 class X def test…