Ruby勉強

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

Ruby

Ruby Goldに受かりました

2016/12にRuby Gold受かっています。 合格者向けカンファでまつもとゆきひろさんにも逢えたのはよかったです!

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…

Ruby オープンクラス

\w ....a-zA-Z0-9な文字列、 \s ....空白文字列 これら以外の文字(記号や特殊文字)を消すメソッドを書く require 'test-unit' class String def changer self.gsub(/[^\w\s]/,"") end end class A < Test::Unit::TestCase def test_changer assert_equal("*(…

Ruby define_methodとclass_eval

# クラスを動的に定義 A = Class.new # #1 # Aクラスのコンテクストで # private_methodであるdefine_methodを使用 A.class_eval{ define_method(:hoge){|a| puts a } } A.new.hoge("hoge") #=> "hoge" # #2 # Aクラスのコンテクストで # private_methodであ…

Ruby 定数の参照順位 - Silver/Gold試験対策

定数は外側を参照し、その次に継承関係を探索する class C CONST = "c" end class A CONST = "a" class B < C p CONST end end #=> "a" このように明示的に、定数を参照することもできる class C CONST = "c" end class A CONST = "a" class B < C p C::CONS…

Ruby Fiber - Silver/Gold試験対策

概要 Fiberは、ノンプリエンプティブ(nonpreemptive)なタスクスケジューリング方式。 Threadはプリエンプティブ(preemptive)。プリエンプティブとは先制、先取の意味がある。 プリエンプティブである、Threadだと、例外が発生したりすると、勝手にスレッドが…

Ruby rdoc - Silver/Gold試験対策

#= "#="で見出し1 #== "#=="見出し2 #=== "#==="さようなら #- "#-"箇条書き1 #- "#-"箇条書き1 #* "#*"箇条書き別の方法 #* "#*"箇条書き別の方法 #1. "#1."箇条書き数字 #2. "#2." #a. "#a."箇条書きアルファベット小文字 #b. "#b." #A. "#A."箇条書きアル…

Ruby Object Class - Silver/Gold試験対策

全てのクラスのスーパークラス。 オブジェクトの一般的な振舞いを定義する このクラスのメソッドは上書きしたり未定義にしない限り、すべてのオブジェクトで使用することができことができる def hoge puts 1 end 上は以下と等価である class Object private …

Ruby 定数の参照順番 - Silver/Gold試験対策

定数は自クラスを参照し、その後、外側のクラスを参照する class C1 MSG = "msg1" MSG2 = "msg2" class C2 MSG = "C2:msg1" puts MSG #=> C2:msg1 puts MSG2 #=> msg2 end puts MSG #=> msg1 puts MSG2 #=> msg2 end MSG3=1 class A puts MSG3 #=> 1 end

Rubyのコマンドラインオプション

MacのTerminalでシェル(bash)実行 -C 指定したディレクトリでスクリプトを実行 # hoge.rb puts("あなたの名前は何ですか?") $ ruby -C ~/Documents/test/ hoge.rb -e Rubyのスクリプトを実行する $ ruby -e 'puts "Hello, Ruby!"' #=> Hello, Ruby! 複数の…