2015-09-01から1ヶ月間の記事一覧
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 でサブクラスで上書きしたスーパークラスのメソッドを super を使う以外で呼び出したい場合、Method#bind を使用します。 class Super def homu "homu" end end class Sub < Super def homu "homuhomu" end end x = Sub.new x.homu # => "homuhomu" # …
,の後にスペース自動入力して欲しいです— Tsuzu (@Wp120_3238) 2015, 10月 22 lexima.vim でやってみた。 " ,の後にスペースを入れる call lexima#add_rule({ \ "at" : '\%#', \ "char" : ",", \ "input" : ",<Space>", \}) " ", " の後にスペースを続けれないよう</space>…
標準出力に Hello World と出力する Vim script を作成して下さい。ただし、数値、文字及び文字列リテラルを解答に含めることはできません。— mattn (@mattn_jp) 2015, 10月 17 と、いうことでやってみた。 let D = {} let D.Hello = {} let http://D.World …
クラスが継承したクラスや include したモジュールの優先順位は Module#ancestors で調べることができます。 module IncludedModule end module PrependedModule end class Super end class X < Super include IncludedModule prepend PrependedModule end X…
クラスが継承したクラスや include したモジュールの優先順位は Module#ancestors で調べることができます。 module IncludedModule end module PrependedModule end class Super end class X < Super include IncludedModule prepend PrependedModule end X…
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…
継承したクラスのメソッドと同じように 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 してみた。続き Twitter で教えてもらって super を使えば元のメソッドを呼びだせるみたい。 [コード] module A def method_added name p "A#method_added: #{name}" end end module B def meth…
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…
みたいな機能が欲しかったので書いてみた。 [コード] 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…
さて、次のようなコードの場合、改行コードを考慮せずに \n までしか返ってきません。 # マッチした文字列を取得したい "homu\nmami" =~ /^h(.*)/ && $1 # => "omu" こういう場合に改行コードも含めて欲しい場合は正規表現のリテラルに /m を追加します。 "h…
大まかに .singleton_method_added、.method_added, #singleton_method_added の3つを使い分ければいい感じですかね。 [コード] class X # クラスメソッドを定義した時に呼び出される def self.singleton_method_added name p "class method : #{name}" end …
Ruby でクラスメソッド、つまりクラスオブジェクトに対して特異メソッドが定義された時に処理をフックしたい場合は .singleton_method_added メソッドを『クラスメソッド』として定義します。 [コード] class X # インスタンスメソッドに singleton_method_a…
Ruby で特異メソッドを定義した際に処理をフックする場合、『インスタンスメソッド』に #singleton_method_added を定義します。 [コード] class X # インスタンスメソッドに singleton_method_added を追加する def singleton_method_added name p name end…
インスタンスメソッドが定義された時に処理をフックしたい場合、『クラスメソッド』に #method_added を定義します。 [コード] class X # クラスメソッドに method_added を追加する def self.method_added name p name end # インスタンスメソッドを定義し…
次のようなコードで 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 …
ヒアドキュメントの識別子で記号を使用したい場合、文字列リテラルで定義することで記号を使用することができます。 str = <<"==EOS==" homu mami mado ==EOS== p str # => "homu\nmami\nmado\n" 便利そう。
特に面白みもないんだけどメンバ変数のポインタがわかっていればアクセスすることは可能よね、と。 [コード] #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>…
いまさらですが 'display' オプションの存在を知りました。 Vuim では1行が長すぎて表示しきれない場合、 と、いうような表示になるんですが、display=lastline というような設定を行うことで このように途中のまでを表示してくれるようになります。 今まで…
特定のクラスオブジェクトに対してインスタンスメソッドを定義したい場合にどういう手段があるのかまとめてみた。 クラス定義から定義する 多分普通のやり方。 単純にクラス定義時にメソッドを定義します。 class String def twice self + self end end "hom…
てっきりトップレベルで定義した変数はグローバル変数扱いで他のファイルからでも参照できるのかと思ったんですが、そういうことはないんですねー。 [a.rb] def a_func :a_func end @a = 42 a = 10 [b.rb] require_relative "./a" # メソッドやインスタンス…
コード eval "a = 42" a = p a 出力 42 さて、これの動作が理解できる Rubyist はどれぐらいいるのだろうか。 なお、詳しい解説は某ももんが氏がしてくれるはず。
Ruby の #eval ではローカル変数を定義することはできませんが、インスタンス変数は定義する事ができるので、それを代替として使用することは可能です。 # ローカル変数定義はできない # eval "a = 42" # インスタンス変数は定義できる eval "@a = 42" p @a …
次のように #eval メソッドでローカル変数を定義した場合、外からは参照することができない。 eval "a = 42" p a + a # => error: undefined local variable or method `a' for main:Object (NameError) これは expr 内のローカル変数の扱いがブロックと同じ…
無限ループというと while 1 みたいな構文で行うことが多いですが、Ruby では #loop メソッドを利用する事ができます。 # ループしたい処理をブロック内に記述する # 終了したい場合は break で抜ける loop { n = rand(0..10) puts n if n == 0 break end } …
知らなかったので覚書。 Ruby では #freeze メソッドを使用して、破壊的なメソッドの呼び出しを抑制する事ができます。 s = "homu" s.freeze s.upcase! # error: `upcase!': can't modify frozen String (RuntimeError) この #freeze メソッドで不変にしたオ…
Ruby で 1/2r みたいな式を見かけたので調べてみた。 2r という風に数値に r サフィックスをつけることで Rational(2/1) という風な定義になるみたい。 なので最初の式は 1 / Rational(2/1) となる。 また、このサフィックスは Ruby 2.1 から導入された模様…
string.h の strtok() を使用すると任意の区切り文字で文字列を分割する事ができるんですが、その使い方が結構ぶっ飛んでて面白かった。 [コード] #include <stdio.h> #include <string.h> int main(){ char str[] = "homu,mami,mado"; char* tp; /* 最初に見つかった区切り文字</string.h></stdio.h>…
自分でビルドするのがだるかったので色々と調べてみた結果、以下のパッケージを使うのが一番手っ取り早かった。 Ubuntu – Details of package libboost1.58-dev in wily boost の最新版は 1.59 だけど、ひとまずこれでいいかなぁ。