Ruby勉強

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

Ruby Gold 3を受ける

2.xは持っているが 日曜プログラマーで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 DATA __END__ - Silver/Gold試験対策

DATAとEND。全て大文字 while DATA.gets puts $_ if $_ =~ /Ruby/ end #=> Ruby the prgoramming language __END__ Java the prgoramming language Ruby the prgoramming language Python the prgoramming language 下記とほぼ同じ DATA.each do |str| puts …

Ruby ライブラリ StringIO - Silver/Gold試験対策

require 'stringio' stringioの使い所がわからなかった。 http://itpro.nikkeibp.co.jp/article/COLUMN/20060314/232389/ まつもとゆきひろさんによると、 ログ出力のケースが挙げられている。 ファイルに書き込まずに、データベースやメモリ上など 多様な出…

Ruby 値渡し/参照渡し挙動 - Silver/Gold試験対策

a=0 b=a c=b d=c p d #=> 0 a += 1 p d #=> 0 a="hoge" b=a c=b d=c p d #=> "hoge" a.capitalize! p d #=> "Hoge" =end a="hoge" e="fuga" b=a c=b d=c a=e p d #=> "hoge" p a #=> "fuga"

Ruby Time - Silver/Gold試験対策

現在時刻 Time.now #=> 例: 2015-09-10 07:31:38 +0900 Time.new #=> 例: 2015-09-10 07:31:38 +0900 指定した時間オブジェクトを返す。 Timeオブジェクトもしくは数値で指定。 数値はUnix起点時間である1970/1/1からの経過秒数 Time.at(1441000000) #=> 201…

Ruby method_missing - Silver/Gold試験対策

No Method Error class Fuga def hoge puts "hogeだよ!" end end fuga = Fuga.new fuga.foo # No Method Error BasicObject Classに定義されている、method_missingではNoMethodError時に実行することを記載できる class Fuga def hoge puts "hogeだよ!" e…

Ruby Refinements - Silver/Gold試験対策

class String def hello self + "hello" end end オープンクラスでのメソッド定義は影響が大きすぎるため、 範囲を限定する為に、refinements を利用可能 ・ファイル内限定 ・usingはトップレベル、クラス、モジュール直下限定 ・メソッド内利用不可 class B…

Ruby 同じ意味のメソッド - Silver/Gold試験対策

findとdetectは同じ a = [1, 5, 8, 15, 22, 23, 14] p a.find {|i| i % 7 == 0 } #=> 14 b = [1, 3] p b.find {|i| i % 7 == 0 } #=> nils c = Proc.new { "7で割り切れる数は要素はありませんでした" } p b.detect(c){|i| i % 7 == 0 } #=> "7で割り切れる…

Ruby Kernelモジュール#1 - Silver/Gold試験対策

Kernelはモジュール Objectクラスのメソッド定義は実際はKernelモジュールが行なってインクルードしている #変換 String(1) #=> "1" Complex(1,2) #=> 1 + 2i Hash(key: :value) #=> {:key => :value} Float(1) #=> 1.0 Float("1") #=> 1.0 Rational(2, 3) #…

Ruby破壊的メソッド - Silver/Gold試験対策

破壊的メソッドのメソッド名には!がついているだけとは限らない リンク リンク !がつかなくても破壊的メソッドがある # Arrayの破壊的メソッドを引き続き覚えれば良い # 破壊的 # String#insert s = "string" s.insert(0, "long-") p s #=> "long-string" # …

Rubyモジュール_prepend - Silver/Gold試験対策

prepend と includeの違い # prependで読み込まれたモジュールメソッドのほうが先に呼び出される module IncludeModule def embeded_method :from_include_module end end module PrependModule def embeded_method :from_prepend_module end end class Prep…