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

Ruby のキーワード一覧

Ruby で使っている構文が言語のキーワードなのか、単なるメソッドなのかわからなくなってきたので調べてみた。 以下の単語が Ruby 2.1 現在のキーワード(というか、予約語)にあたる。 BEGIN class ensure nil self when END def false not super while ali…

std::weak_ptr について軽く調べてみた

C++

std::weak_ptr について軽く調べてみた。 C++ のスマートポインタまわりの知識は全然なかったりする。 [std::weak_ptr] std::shared_ptr が参照カウントを使用してオブジェクトの所有権を管理するのに対して、std::weak_ptr は所有権を持たずにオブジェクト…

watchdogs.vim に redpen の設定を追加した

Vim

@pink_bangbi なるほど。厚かましくも設定ファイルでなく本家のautoload/watchdogs.vimに今日 #osakavim でやったmarkdown用のチェッカーを入れていただきたいと思っているのですがmarkdownのsupportをご検討いただけますか?— Kozo Nishida (@kozo2) 2015, 6…

Vim でバッファラインを絞り込むプラグインをつくった

Vim

まだいくつか実装したいことは残っているんですが、忙しくて手につかなさそうなので一旦リリースしてしまおうかなーと。 実は結構前からこそこそつくっていたりしました。 hopping.vim は検索したワードにマッチした行のみを表示するプラグインになります。 …

Ruby で Hash のキーを文字列からシンボルに変換する

と、いうのをやりたかった。 以下のようにやるのが簡単かな? h = { "name" => "homu", "age" => 14 } Hash[ h.map{ |k, v| [k.to_sym, v] } ] # => {:name=>"homu", :age=>14} [おまけ] ついでに iolite を使ってやってみた。 require "iolite" require "io…

Ruby でトップレベルでメソッドを定義する

Ruby では次のようにトップレベルにメソッドを定義した場合、そのメソッドは Kernel モジュールの private メソッドとして定義されます。 puts Kernel.private_methods.include? :hoge # => false # Kernel の private メソッドに追加される def hoge end pu…

C++17 で名前付き引数を書いてみた 〜完全版〜

C++

C++17 で実装されているらしい、user defined literals の機能を使って、C++17 で名前付き引数を書いてみた。 ちなみに不完全版はこっち。 C++17 で名前付き引数書いてみた。C++17 だとこういうこともできる http://t.co/sqoMmQbCGP— バンビちゃん@実際偽物…

Ruby のオプション引数にはシンボルをキーとした Hash 値しか渡せない

ハマったので覚書。 次のようにオプション引数に対してシンボル以外の値をキーとした Hash 値を渡そうとしたらエラーになりました。 def disp **opt puts opt end disp # => {} disp(name: "homu", age: 14) # => {:name=>"homu", :age=>14} disp("name" => …

Ruby の BasicObject を利用したい場面

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 のメソッドやオブジェクトまわりの名称について軽くまとめてみた

Ruby におけるクラスやメソッド、オブジェクトの意味についていまいちピンと来なかったので雑にまとめてみた。 奈緒、内容が間違っているかも知れないのであしからず。 [クラスオブジェクト] class を使って定義したオブジェクトのこと。 # X はクラスオブジ…

Ruby の BasicObject

Ruby の BasicObject とはほぼ何も定義されていないクラスです。 Ruby はほぼすべてのクラスが Object クラスを継承しています。 なので最初からいくつかのメソッドが定義されていますが、意図的にメソッドを定義してほしくない場合にはこの BasicObject を…

Ruby のレシーバとは

Ruby ではメソッドを呼び出す時のオブジェクトのことをレシーバと言います。 もっと簡単にいうと . の左側にあるものを指します。 "abc".capitalize # レシーバ : "abc" x = Hash.new # レシーバ : Hash x.has_key? "key" # レシーバ : x 1 + 2 # レシーバ :…

記事数が100を超えてた

はてなブログに移行してからだいたい毎日書いていたんですが、気がついたら記事数が100を超えていた。 割と忙しい時期もあったんだけどなんだかんだで続けていられるなーと。 この調子で続けていけたらいいのだけれども…。 奈緒、最近また忙しくてこれも3日…

C++ で末尾に自動で ; をつけるような Vim script 書いてみた

最初は lexima.vim で設定してみたんですが、うまくいかなかったので雑スクリプト書いた。 とりあえず、insert mode を抜けた時に発動するようにしています。 augroup cpp-auto; autocmd! " 末尾が " ' ) の場合に ; を追加する autocmd InsertLeave * \ if …

C++14 以前で関数テンプレートを変数や関数に渡すときにテンプレート型を明示化するのを回避する

C++

前回、C++14 で多相ラムダを使って回避する方法を書いたんですが、ついでに C++14 以前の回避方法も書いてみる。 と、いっても単に関数オブジェクトにするだけですが。 // template<typename T, typename U> // auto // plus(T a, U b){ // return a + b; // } // 関数ではなくてクラ</typename>…

C++14 で関数テンプレートを変数や関数に渡すときにテンプレート型を明示化するのを回避する

C++ で関数テンプレートを変数や関数に渡す場合は、渡すときにテンプレート型を明示化する必要があります。 template<typename T, typename U> auto plus(T a, U b){ return a + b; } // こういう風に渡すことはできない // auto f = &plus; // 変数に渡す場合はテンプレート引数を明</typename>…

watchdogs.vim に eslint の設定を追加した

Vim

watchdogs.vim に eslintの設定を追加しました。 JavaScript で eslint を使用したい場合は g:quickrun_config に以下のような設定を追加してください。 let g:quickrun_config = { \ "javascript/watchdogs_checker" : { \ "type" : "watchdogs_checker/esl…

C++03 で 関数ポインタ型をわかりやすく定義する

C++

さて、C++03 時代に関数ポインタ型を定義する場合は、 // int func(int, int); を保持する // func_type という名前の関数ポインタ型の定義 typedef int(*func_type)(int, int); みたいに定義する必要があります。 しかし、上のコードを見てもわかるとおり、…

Ruby で return する proc をメソッドの外で評価すると…

例外になります。 def method proc { return 10 } end proc = method # Error: unexpected return (LocalJumpError) proc.call まぁ普通はこんなことしないでしょうけど。

Ruby の lambda や proc はキーワードではない

Vim

Vim のシンタックスハイライトで lambda や proc がハイライトされていたのですっかり勘違いしていたんですが、この2つは Ruby のキーワードではなくて『Kernel のモジュール関数』になります。 つまり単なるメソッドです。 Vim でこういう『キーワードじゃ…

Ruby の proc と lambda の違い

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 すると…

Ruby のブロック内で return するとブロックを抜けるのではなくて、メソッドから抜けます。 [コード] def sum n result = 0 n.times.each { |it| # ここで return を呼ぶとブロックを抜けるのではなくて # メソッドから抜ける return if it > 10 result += i…

C++ で std::ignore を使用して std::tie() で一部の値を受け取らないようにする

C++

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 で多重代入

Ruby では以下のように複数の変数に対して1度に代入する事ができます。 [コード] # カンマで区切った値をそれぞれに代入できる a, b = 1, 2 # => 1, 2 # リストを受け取ることもできる a, b, = [3, 4] # => 1, 2 # * を着けた場合、それ以降の値をリストで受…

automatic.vim の依存関係を見直した

Vim

automatic.vim が gift.vim に依存していたので、vital-gift を組み込んで外部プラグインには依存しないようにしました。 あんまり動作確認してないので、何か問題があれば issues までお願いします。

Ruby で static 関数のようなものを定義したかった

C 言語の static 関数ような『そのファイルのみで参照できる関数』を Ruby でも定義したかったのですが、そういう機能はないみたいなのでちょっと考えてみました。 [コード] def static_def name, &block name = caller.first[/([^:]+):/, 1] + name.to_s de…

Ruby の #method_added と #singleton_method_added の違い

両方ともクラスやモジュールにメソッドが定義された時に呼ばれるメソッドですが、 #method_added は『メソッドの定義』、#singleton_method_added は『特異メソッドの定義』という違いがあります。 [コード] class X # #method_added はクラスメソッドとして…

Ruby でコールスタックを取得する

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:…

Ruby でメソッドが追加された時に別名で定義し直す

と、いうのを書いてみました。 [コード] 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 …

Ruby で無名モジュール

無名クラスと同じような感じで定義できます。 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" と、書いてみたのもの具体的にどんな時に便利だろうか。