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

Ruby 2.2 の Method#super_method

Ruby 2.2 で追加された Method#super_method を使用するとスーパークラスのメソッドを呼び出します。 class Super def homu "homu" end end class Sub < Super def homu "homuhomu" end end x = Sub.new # スーパークラスのメソッドを呼び出す x.method(:hom…

Ruby でサブクラスからスーパークラスのメソッドを明示的に呼び出す

Ruby でサブクラスで上書きしたスーパークラスのメソッドを super を使う以外で呼び出したい場合、Method#bind を使用します。 class Super def homu "homu" end end class Sub < Super def homu "homuhomu" end end x = Sub.new x.homu # => "homuhomu" # …

Vim で , の後にスペースを自動で挿入する

Vim

,の後にスペース自動入力して欲しいです— Tsuzu (@Wp120_3238) 2015, 10月 22 lexima.vim でやってみた。 " ,の後にスペースを入れる call lexima#add_rule({ \ "at" : '\%#', \ "char" : ",", \ "input" : ",<Space>", \}) " ", " の後にスペースを続けれないよう</space>…

Vim script で数値、文字及び文字列リテラルを使わないで Hello World を出力

Vim

標準出力に Hello World と出力する Vim script を作成して下さい。ただし、数値、文字及び文字列リテラルを解答に含めることはできません。— mattn (@mattn_jp) 2015, 10月 17 と、いうことでやってみた。 let D = {} let D.Hello = {} let http://D.World …

Ruby でクラスが継承したクラスや include したモジュールの優先順位を調べる

クラスが継承したクラスや include したモジュールの優先順位は Module#ancestors で調べることができます。 module IncludedModule end module PrependedModule end class Super end class X < Super include IncludedModule prepend PrependedModule end X…

Ruby でクラスが継承したクラスや include したモジュールの優先順位を調べる

クラスが継承したクラスや include したモジュールの優先順位は Module#ancestors で調べることができます。 module IncludedModule end module PrependedModule end class Super end class X < Super include IncludedModule prepend PrependedModule end X…

Ruby で include と継承した場合の super の優先順位

include と継承した場合、どちらが優先的に調べるのか試してみた。 [コード] module M def homu p "M#homu" end end class Base def homu p "Base#homu" end end class X < Base include M def homu p "X#homu" super end end X.new.homu [出力] "X#homu" "M…

Ruby で include した module のメソッドを呼ぶ

継承したクラスのメソッドと同じように super で呼び出すことができます。 [コード] module M def homu p "M#homu" end end class X include M def homu p "X#homu" # include した同名のメソッドを呼ぶ super end end X.new.homu [出力] "X#homu" "M#homu"

Ruby で #method_added が定義されてるモジュールを複数 mixin してみた。続き

Ruby で #method_added が定義されてるモジュールを複数 mixin してみた。続き Twitter で教えてもらって super を使えば元のメソッドを呼びだせるみたい。 [コード] module A def method_added name p "A#method_added: #{name}" end end module B def meth…

Ruby で #method_added が定義されてるモジュールを複数 mixin してみた

Ruby で #method_added が定義されてるモジュールを複数 mixin してみたらどうなるのか試してみた。 [コード] module A def method_added name p "A#method_added: #{name}" end end module B def method_added name p "B#method_added: #{name}" end end cl…

Ruby でメソッドを薄くラップする

みたいな機能が欲しかったので書いてみた。 [コード] module MethodWrapper def wrap name, &block prepend(Module.new do define_method name do super_ = proc { super() } Object.new.instance_eval do define_singleton_method :super_ do super_.() end…

Ruby の正規表現の比較で改行コードを配慮する

さて、次のようなコードの場合、改行コードを考慮せずに \n までしか返ってきません。 # マッチした文字列を取得したい "homu\nmami" =~ /^h(.*)/ && $1 # => "omu" こういう場合に改行コードも含めて欲しい場合は正規表現のリテラルに /m を追加します。 "h…

Ruby でメソッドが追加された時に呼び出されるメソッドのまとめ

大まかに .singleton_method_added、.method_added, #singleton_method_added の3つを使い分ければいい感じですかね。 [コード] class X # クラスメソッドを定義した時に呼び出される def self.singleton_method_added name p "class method : #{name}" end …

Ruby でクラスメソッドが定義された時に処理をフックする

Ruby でクラスメソッド、つまりクラスオブジェクトに対して特異メソッドが定義された時に処理をフックしたい場合は .singleton_method_added メソッドを『クラスメソッド』として定義します。 [コード] class X # インスタンスメソッドに singleton_method_a…

Ruby で特異メソッドを定義した際に処理をフックする

Ruby で特異メソッドを定義した際に処理をフックする場合、『インスタンスメソッド』に #singleton_method_added を定義します。 [コード] class X # インスタンスメソッドに singleton_method_added を追加する def singleton_method_added name p name end…

Ruby でインスタンスメソッドが定義された時に処理をフックする

インスタンスメソッドが定義された時に処理をフックしたい場合、『クラスメソッド』に #method_added を定義します。 [コード] class X # クラスメソッドに method_added を追加する def self.method_added name p name end # インスタンスメソッドを定義し…

Ruby で define_method で定義した中から super を呼び出す

次のようなコードで define_method 内から super を呼びだそうとしたらエラーになりました。 module M define_method :homu do p :superhomu # ここで元のメソッドを呼び出したかった super end end class X prepend M def homu p :homu end end X.new.homu …

Ruby のヒアドキュメントの識別子で記号を使う

ヒアドキュメントの識別子で記号を使用したい場合、文字列リテラルで定義することで記号を使用することができます。 str = <<"==EOS==" homu mami mado ==EOS== p str # => "homu\nmami\nmado\n" 便利そう。

C++ の private メンバにアクセスする手段

C++

特に面白みもないんだけどメンバ変数のポインタがわかっていればアクセスすることは可能よね、と。 [コード] #include <iostream> struct X{ auto get_value_ptr(){ return &X::value; } private: int value = 42; }; int main(){ X x; // error // x.value; auto valu</iostream>…

Vim で長すぎて表示されない行を表示する

Vim

いまさらですが 'display' オプションの存在を知りました。 Vuim では1行が長すぎて表示しきれない場合、 と、いうような表示になるんですが、display=lastline というような設定を行うことで このように途中のまでを表示してくれるようになります。 今まで…

Ruby でインスタンスメソッドを定義する手段

特定のクラスオブジェクトに対してインスタンスメソッドを定義したい場合にどういう手段があるのかまとめてみた。 クラス定義から定義する 多分普通のやり方。 単純にクラス定義時にメソッドを定義します。 class String def twice self + self end end "hom…

Ruby でトップレベルで定義したローカル変数は他のファイルからは参照されない

てっきりトップレベルで定義した変数はグローバル変数扱いで他のファイルからでも参照できるのかと思ったんですが、そういうことはないんですねー。 [a.rb] def a_func :a_func end @a = 42 a = 10 [b.rb] require_relative "./a" # メソッドやインスタンス…

今日教えてもらった Ruby の意味不明なコード

コード eval "a = 42" a = p a 出力 42 さて、これの動作が理解できる Rubyist はどれぐらいいるのだろうか。 なお、詳しい解説は某ももんが氏がしてくれるはず。

Ruby の eval でローカル変数に代入したかった

Ruby の #eval ではローカル変数を定義することはできませんが、インスタンス変数は定義する事ができるので、それを代替として使用することは可能です。 # ローカル変数定義はできない # eval "a = 42" # インスタンス変数は定義できる eval "@a = 42" p @a …

Ruby の eval メソッドでローカル変数定義はできない

次のように #eval メソッドでローカル変数を定義した場合、外からは参照することができない。 eval "a = 42" p a + a # => error: undefined local variable or method `a' for main:Object (NameError) これは expr 内のローカル変数の扱いがブロックと同じ…

Ruby で無限ループする

無限ループというと while 1 みたいな構文で行うことが多いですが、Ruby では #loop メソッドを利用する事ができます。 # ループしたい処理をブロック内に記述する # 終了したい場合は break で抜ける loop { n = rand(0..10) puts n if n == 0 break end } …

Ruby の #freeze メソッドで凍結したオブジェクトを元に戻すことはできない

知らなかったので覚書。 Ruby では #freeze メソッドを使用して、破壊的なメソッドの呼び出しを抑制する事ができます。 s = "homu" s.freeze s.upcase! # error: `upcase!': can't modify frozen String (RuntimeError) この #freeze メソッドで不変にしたオ…

Ruby の r サフィックス

Ruby で 1/2r みたいな式を見かけたので調べてみた。 2r という風に数値に r サフィックスをつけることで Rational(2/1) という風な定義になるみたい。 なので最初の式は 1 / Rational(2/1) となる。 また、このサフィックスは Ruby 2.1 から導入された模様…

C言語で任意の区切り文字で文字列を分割する

string.h の strtok() を使用すると任意の区切り文字で文字列を分割する事ができるんですが、その使い方が結構ぶっ飛んでて面白かった。 [コード] #include <stdio.h> #include <string.h> int main(){ char str[] = "homu,mami,mado"; char* tp; /* 最初に見つかった区切り文字</string.h></stdio.h>…

Ubuntu で新し目の boost をインストールしたかった

自分でビルドするのがだるかったので色々と調べてみた結果、以下のパッケージを使うのが一番手っ取り早かった。 Ubuntu – Details of package libboost1.58-dev in wily boost の最新版は 1.59 だけど、ひとまずこれでいいかなぁ。