2015-06-01から1ヶ月間の記事一覧
Ruby で使っている構文が言語のキーワードなのか、単なるメソッドなのかわからなくなってきたので調べてみた。 以下の単語が Ruby 2.1 現在のキーワード(というか、予約語)にあたる。 BEGIN class ensure nil self when END def false not super while ali…
std::weak_ptr について軽く調べてみた。 C++ のスマートポインタまわりの知識は全然なかったりする。 [std::weak_ptr] std::shared_ptr が参照カウントを使用してオブジェクトの所有権を管理するのに対して、std::weak_ptr は所有権を持たずにオブジェクト…
@pink_bangbi なるほど。厚かましくも設定ファイルでなく本家のautoload/watchdogs.vimに今日 #osakavim でやったmarkdown用のチェッカーを入れていただきたいと思っているのですがmarkdownのsupportをご検討いただけますか?— Kozo Nishida (@kozo2) 2015, 6…
まだいくつか実装したいことは残っているんですが、忙しくて手につかなさそうなので一旦リリースしてしまおうかなーと。 実は結構前からこそこそつくっていたりしました。 hopping.vim は検索したワードにマッチした行のみを表示するプラグインになります。 …
と、いうのをやりたかった。 以下のようにやるのが簡単かな? h = { "name" => "homu", "age" => 14 } Hash[ h.map{ |k, v| [k.to_sym, v] } ] # => {:name=>"homu", :age=>14} [おまけ] ついでに iolite を使ってやってみた。 require "iolite" require "io…
Ruby では次のようにトップレベルにメソッドを定義した場合、そのメソッドは Kernel モジュールの private メソッドとして定義されます。 puts Kernel.private_methods.include? :hoge # => false # Kernel の private メソッドに追加される def hoge end pu…
C++17 で実装されているらしい、user defined literals の機能を使って、C++17 で名前付き引数を書いてみた。 ちなみに不完全版はこっち。 C++17 で名前付き引数書いてみた。C++17 だとこういうこともできる http://t.co/sqoMmQbCGP— バンビちゃん@実際偽物…
ハマったので覚書。 次のようにオプション引数に対してシンボル以外の値をキーとした Hash 値を渡そうとしたらエラーになりました。 def disp **opt puts opt end disp # => {} disp(name: "homu", age: 14) # => {:name=>"homu", :age=>14} disp("name" => …
Ruby の BasicObject を利用したい場面ですが、公式では Proxy パターンを例にだしています。 class Proxy < BasicObject def initialize target @target = target end def method_missing name, *args @target.__send__ name, *args end end proxy = Proxy.…
Ruby におけるクラスやメソッド、オブジェクトの意味についていまいちピンと来なかったので雑にまとめてみた。 奈緒、内容が間違っているかも知れないのであしからず。 [クラスオブジェクト] class を使って定義したオブジェクトのこと。 # X はクラスオブジ…
Ruby の BasicObject とはほぼ何も定義されていないクラスです。 Ruby はほぼすべてのクラスが Object クラスを継承しています。 なので最初からいくつかのメソッドが定義されていますが、意図的にメソッドを定義してほしくない場合にはこの BasicObject を…
Ruby ではメソッドを呼び出す時のオブジェクトのことをレシーバと言います。 もっと簡単にいうと . の左側にあるものを指します。 "abc".capitalize # レシーバ : "abc" x = Hash.new # レシーバ : Hash x.has_key? "key" # レシーバ : x 1 + 2 # レシーバ :…
はてなブログに移行してからだいたい毎日書いていたんですが、気がついたら記事数が100を超えていた。 割と忙しい時期もあったんだけどなんだかんだで続けていられるなーと。 この調子で続けていけたらいいのだけれども…。 奈緒、最近また忙しくてこれも3日…
最初は lexima.vim で設定してみたんですが、うまくいかなかったので雑スクリプト書いた。 とりあえず、insert mode を抜けた時に発動するようにしています。 augroup cpp-auto; autocmd! " 末尾が " ' ) の場合に ; を追加する autocmd InsertLeave * \ if …
前回、C++14 で多相ラムダを使って回避する方法を書いたんですが、ついでに C++14 以前の回避方法も書いてみる。 と、いっても単に関数オブジェクトにするだけですが。 // template<typename T, typename U> // auto // plus(T a, U b){ // return a + b; // } // 関数ではなくてクラ</typename>…
C++ で関数テンプレートを変数や関数に渡す場合は、渡すときにテンプレート型を明示化する必要があります。 template<typename T, typename U> auto plus(T a, U b){ return a + b; } // こういう風に渡すことはできない // auto f = + // 変数に渡す場合はテンプレート引数を明</typename>…
watchdogs.vim に eslintの設定を追加しました。 JavaScript で eslint を使用したい場合は g:quickrun_config に以下のような設定を追加してください。 let g:quickrun_config = { \ "javascript/watchdogs_checker" : { \ "type" : "watchdogs_checker/esl…
さて、C++03 時代に関数ポインタ型を定義する場合は、 // int func(int, int); を保持する // func_type という名前の関数ポインタ型の定義 typedef int(*func_type)(int, int); みたいに定義する必要があります。 しかし、上のコードを見てもわかるとおり、…
例外になります。 def method proc { return 10 } end proc = method # Error: unexpected return (LocalJumpError) proc.call まぁ普通はこんなことしないでしょうけど。
Vim のシンタックスハイライトで lambda や proc がハイライトされていたのですっかり勘違いしていたんですが、この2つは Ruby のキーワードではなくて『Kernel のモジュール関数』になります。 つまり単なるメソッドです。 Vim でこういう『キーワードじゃ…
Ruby でブロックをオブジェクトとして扱いたい場合、proc や lambda を利用する事ができます。 proc = proc { |a, b| a + b } proc.call 1, 2 # => 3 lam = lambda { |a, b| a - b } lam.call 1, 2 # => -1 この 2つは書き方は似ていますが、挙動が少し異な…
Ruby のブロック内で return するとブロックを抜けるのではなくて、メソッドから抜けます。 [コード] def sum n result = 0 n.times.each { |it| # ここで return を呼ぶとブロックを抜けるのではなくて # メソッドから抜ける return if it > 10 result += i…
std::tie() を利用すると std::tuple の値を複数の変数で一度に受け取る事ができます。 auto calc(int a, int b){ return std::make_tuple(a + b, a - b, a * b, a / b); } int a, b, c, d; std::tie(a, b, c, d) = calc(6, 2); [一部の値のみ受け取る] std:…
Ruby では以下のように複数の変数に対して1度に代入する事ができます。 [コード] # カンマで区切った値をそれぞれに代入できる a, b = 1, 2 # => 1, 2 # リストを受け取ることもできる a, b, = [3, 4] # => 1, 2 # * を着けた場合、それ以降の値をリストで受…
automatic.vim が gift.vim に依存していたので、vital-gift を組み込んで外部プラグインには依存しないようにしました。 あんまり動作確認してないので、何か問題があれば issues までお願いします。
C 言語の static 関数ような『そのファイルのみで参照できる関数』を Ruby でも定義したかったのですが、そういう機能はないみたいなのでちょっと考えてみました。 [コード] def static_def name, &block name = caller.first[/([^:]+):/, 1] + name.to_s de…
両方ともクラスやモジュールにメソッドが定義された時に呼ばれるメソッドですが、 #method_added は『メソッドの定義』、#singleton_method_added は『特異メソッドの定義』という違いがあります。 [コード] class X # #method_added はクラスメソッドとして…
Ruby でメソッドのコールスタックを取得したい場合 Kernel.#caller メソッドが利用できます。 [コード] def test1 p caller end def test2 test1 end test2 [出力] ["/mnt/sub/ruby/test/caller/main.rb:6:in `test2'", "/mnt/sub/ruby/test/caller/main.rb:…
と、いうのを書いてみました。 [コード] class X @@ignore = false def self.method_added name if @@ignore || name == :method_added @@ignore = false return end @@ignore = true alias_method "_#{name}", name remove_method name end def hoge :hoge …
無名クラスと同じような感じで定義できます。 M = Module.new { def self.homu "homu" end def mami "mami" end } p M.homu # => "homu" class X include M end x = X.new p x.mami # => "mami" と、書いてみたのもの具体的にどんな時に便利だろうか。