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

Ruby の #instance_eval と #instance_exec の違い

#instance_eval は渡されたブロックをレシーバのインスタンス元で実行するメソッドです。 なので例えば次のようにしてインスタンス変数をブロック内から参照する事ができます。 class X def initialize @name = "homu" end end x = X.new p x.instance_eval …

Ruby は #!= 内で #== が呼ばれる

#!= 内で #== が呼ばれているため、#== を再定義すると #!= にも影響が及びます。 [コード] class X def == other p "==" true end end X.new == "" # => true X.new != "" # => false [出力] "==" "==" #== に副作用があるとちょっと注意する必要があるかも…

Ruby でインスタンスオブジェクトに対して attr_accessor を使う

インスタンスオブジェクトに対して特異メソッドとして attr_accessor を使ってアクセッサを定義したかったので考えてみた。 class << を使って attr_accessor を呼び出すのがよいのかな? class X end x = X.new # インスタンスオブジェクトを渡す class << …

Ruby の using が refine 内だと反映されない

Refinements の refine 内では外のスコープで定義した using は反映されませんでした。 module A refine Object do def mami :mami end end end using A module B refine Class do def homu self.mami end end end using B Class.new.homu # => Error: undef…

C++ のラムダ式の引数型を推論する

C++

そういう話が Slack の C++ の会で出てたので簡単にラムダ式の引数型を取得するメタ関数を書いてみた。 #include <utility> template<typename... Args> struct parameter_pack{}; template<typename F, typename R, typename... Args> parameter_pack<Args...> args_impl(F, R(F::*f)(Args...) const); template<typename F> auto args(F f)->decltype(a</typename></args...></typename></typename...></utility>…

Ruby の attr_accessor に対して外部のスコープの変数を渡したかった

どういうことかというと次のような事がやりたかった attr = :name class X # class 外の変数を attr_accessor に渡したい attr_accessor attr end [解決] 次のように Module + #include で解決することは出来ました。 attr = :name X = Class.new.include(Mo…

初心者 C++er Advent Calendar 2015 の募集を開始しました

なんとなく勢いで立てました。 初心者 C++er Advent Calendar 2015 - Adventar 初心者のためのゆるふわなアドベントカレンダーになります。 興味のある人は参加してみてくださいー。 ちなみにガチなネタを書きたい方は別のアドベントカレンダーもあるのでそ…

Qiita で Ruby Advent Calendar 2015 つくった

なかったのでつくった。 Ruby Advent Calendar 2015 - Qiita さすがに1人じゃ寂しいので気になる方は参加してみてください。

Ruby でシェルの単語で分割する

Ruby で文字列からシェルの単語で分割する場合、'' や "" なんかを考慮する必要があり、単にスペースで split するだけでは対応できません。 そういう時には shellwords モジュールの Shellwords.split が利用できます。 require "shellwords" Shellwords.sp…

C++03 で has_xxx の実装

C++

久々に書いてみたら全然書き方覚えてなかったので覚書。 template<typename T> struct sfinae_helper{ typedef void type; }; template<typename T, typename U = void> struct has_xxx{ static bool const value = false; }; template<typename T> struct has_xxx<T, typename sfinae_helper<typename T::xxx>::type>{ static bool const value = tru…</t,></typename></typename></typename>

Ruby の ` メソッド

昨日、Ruby の単項演算子について調べていたんですが、` という演算子があったので調べてみました。 そもそも Ruby の ` は『シェルコマンドを実行する手段』ぐらいしか知らなかったんですが、これって Kernel のメソッドだったんですね…。 module function …

Ruby で使用できる単項演算子

Ruby で使用できる単項演算子を調べてみた。 Ruby では +, -, ~, ! が単項演算子と使用でき、さらに再定義することもできます。 [コード] class X def +@ p "+" end def -@ p "-" end def ~ p "~" end def ! p "!" end end def ` str p str end x = X.new +x…

C++ の会に参加している

最近、主に Slack で活動してる C++ の会に参加してみました。 主に Slack で雑談でしてるだけなんですが、興味のある方はこちらから登録してください。 アクティブユーザが少なくて寂しい。

Ubuntu で nokogiri をインストールする

nokogiri をインストールしようとしたらエラーになったので対処方法を覚書。 gem から nokogiri をインストールしようとしたら以下のようにエラーになりました。 $ sudo gem install nokogiri Building native extensions. This could take a while... ERROR…

公開用の Slack で招待フォーラムを用意する

最近、某 Slack に参加しているんですが、『参加するのにいちいちメルアド聞くのがめんどくさいよねー』ということ以下のサイトを参考にして招待用のフォーラムをつくりました。 公開Slack用 自動招待フォーム by GAS - Qiita GoogleApps を使っているのでこ…

Ubuntu に Ruby2.2 をインストールする

Ruby2.2 をインストールしたかったので調べてみた。 基本的には以下のサイトのようにPPAパッケージを使用すれば問題ない。 PPAパッケージを利用してRuby 2.2をUbuntu 14.04にインストールする | hrendoh's memohrendoh's memo [Ruby2.2 のインストール] $ su…

Ruby で Object#instance_variable_set 等を使うときの注意

Ruby では Object#instance_variable_set を使用することで任意の名前のインスタンス変数に値を設定することができます。 class X attr_reader :name end x = X.new # @ + 変数名を渡す x.instance_variable_set(:@name, "homu") x.name # => name Object#in…

gem でインストールしようとしたら "Marshal data too short" とエラーになった

gem で mechanize をインストールしようとしたらエラーになった。 $ sudo gem install mechanize ERROR: While executing gem ... (ArgumentError) marshal data too short [解決] ~/.gem/ を削除したら解決した。 エラーになっていた理由はいまいちわからず…