Ruby勉強

インターネットの企画職な人がプログラミングを勉強するブログ

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

Ruby %記法

%q, %Q, % コーテーションをエスケープしてくれる。%Q, %は式展開あり %q(ダブルコーテーションは"と書きます) #=> "ダブルコーテーションは\"と書きます" %w,% W 配列。%Wは式展開あり %w(aa bb cc) #=> ["aa", "bb", "cc"] %i, %I シンボル配列。%I は式展…

Ruby 古いメソッドを呼び出された場合

古いメソッドを警告を出しながらも実行する方法 module Deprecator def deprecate(old_method, new_method) define_method(old_method) do |*args,&block| warn "Warning: #{old_method} is deprecated. Use #{new_method}()" __send__(new_method,*args,&bl…

Ruby 特異メソッドとダックタイピング

特異メソッドはこういった変数に入ったStringオブジェクトにも追加可能 ・オープンクラス ・Refinements これらを作成するほどでもない特定箇所でのメソッド利用の場合は、お手軽にこういうものが使える。 厳密なクラス定義に拠らないところが特徴。 ダック…

Ruby 無名クラス、クラス定義のもうひとつの形

無名クラス、クラス定義をフラットスコープ # 変数にクラス定義を代入 c = Class.new(Array) do def my 'Hello!' end end # それでもメソッドはつかえる p c.new.my #=> "Hello!" # cは無名クラス p c.name #=> nil # 定数に代入してみる Myclass = c # cの…

Ruby Methodクラス UnboundMethodクラス

Methodオブジェクトは、メソッドを保存でき、callで実行できる class A def hoge puts 1 end end a = A.new.method(:hoge) a.call #=> UnboundMethodはメソッドの付け替えが可能 同じクラス、もしくはサブクラスにしかつけかえられない class C def my_metho…

Ruby __send__, instance_eval, instance_exec

privateメソッドでも、 sendやinstance_evalならば実行可能 class A private def a @value = "a" puts @value end end obj = A.new obj.__send__(:a) #=> "a" # instance_evalはブロックを実行可能 obj.instance_eval{ puts(@value + "b") }#=> "ab" instant…

Ruby Proc/lambda

Procとlambdaで break時、return、retry時の挙動が異なる。 l1 = lambda {return 10} l2 = lambda {break 20} p l1.call #=> 10 p l2.call #=> 20 p1 = Proc.new {return 10} p2 = Proc.new {break 20} p p1.call #=> unexpected return (LocalJumpError) p …

Ruby Refinements(2回目)

オープンクラス定義 class String def to_alphanumeric gsub(/[^\w\s]/,'') end end だが、副作用が発生しやすい Refinementsは module StringEnhance refine String do def to_alphanumeric gsub(/[^\w\s]/,'') end end end using StringEnhance p "beautif…

Ruby prepend(2度目)

module M1 def hoge "from M1 Module" end end module M2 def hoge "from M2 Module" end end class K prepend M1 include M2 def hoge "from K class" end end p K.new.hoge #=> "from M1 Module"

Ruby 定数

大文字で始まるものは定数 module M MyConstant = "外側" class MyClass MyConstant = "内側" end end p M.constants #=> [:MyConstant, :MyClass]。大文字で始まるものはクラス名であろうがとりあえず全部定数。 p ::M::MyConstant #=> "外側" p ::M::MyCla…

Ruby クラス作成時のオブジェクト関係

クラスを宣言した時の継承関係 class A; end p A.ancestors #=> [A, Object, Kernel, BasicObject]。先祖 p A.class #=> Class。クラスクラス。 p Class.class #=> Class p Class.superclass #=> Module。モジュールクラスを継承していることに注目 p A.supe…