2.xは持っているが 日曜プログラマーでRubyは業務効率化くらいでしか使ってないので 知識をアップデートする。 要項は以下 実行環境 組み込み変数/定数 文法 リテラル 変数と定数 演算子 ブロック 例外処理 大域脱出 キーワード引数 ナンバードパラメータ ラ…
2016/12にRuby Gold受かっています。 合格者向けカンファでまつもとゆきひろさんにも逢えたのはよかったです!
%q, %Q, % コーテーションをエスケープしてくれる。%Q, %は式展開あり %q(ダブルコーテーションは"と書きます) #=> "ダブルコーテーションは\"と書きます" %w,% W 配列。%Wは式展開あり %w(aa bb cc) #=> ["aa", "bb", "cc"] %i, %I シンボル配列。%I は式展…
古いメソッドを警告を出しながらも実行する方法 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…
特異メソッドはこういった変数に入ったStringオブジェクトにも追加可能 ・オープンクラス ・Refinements これらを作成するほどでもない特定箇所でのメソッド利用の場合は、お手軽にこういうものが使える。 厳密なクラス定義に拠らないところが特徴。 ダック…
無名クラス、クラス定義をフラットスコープ # 変数にクラス定義を代入 c = Class.new(Array) do def my 'Hello!' end end # それでもメソッドはつかえる p c.new.my #=> "Hello!" # cは無名クラス p c.name #=> nil # 定数に代入してみる Myclass = c # cの…
Methodオブジェクトは、メソッドを保存でき、callで実行できる class A def hoge puts 1 end end a = A.new.method(:hoge) a.call #=> UnboundMethodはメソッドの付け替えが可能 同じクラス、もしくはサブクラスにしかつけかえられない class C def my_metho…
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…
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 …
オープンクラス定義 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…
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"
大文字で始まるものは定数 module M MyConstant = "外側" class MyClass MyConstant = "内側" end end p M.constants #=> [:MyConstant, :MyClass]。大文字で始まるものはクラス名であろうがとりあえず全部定数。 p ::M::MyConstant #=> "外側" p ::M::MyCla…
クラスを宣言した時の継承関係 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…
\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("*(…
# クラスを動的に定義 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であ…
定数は外側を参照し、その次に継承関係を探索する 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…
概要 Fiberは、ノンプリエンプティブ(nonpreemptive)なタスクスケジューリング方式。 Threadはプリエンプティブ(preemptive)。プリエンプティブとは先制、先取の意味がある。 プリエンプティブである、Threadだと、例外が発生したりすると、勝手にスレッドが…
#= "#="で見出し1 #== "#=="見出し2 #=== "#==="さようなら #- "#-"箇条書き1 #- "#-"箇条書き1 #* "#*"箇条書き別の方法 #* "#*"箇条書き別の方法 #1. "#1."箇条書き数字 #2. "#2." #a. "#a."箇条書きアルファベット小文字 #b. "#b." #A. "#A."箇条書きアル…
全てのクラスのスーパークラス。 オブジェクトの一般的な振舞いを定義する このクラスのメソッドは上書きしたり未定義にしない限り、すべてのオブジェクトで使用することができことができる def hoge puts 1 end 上は以下と等価である class Object private …
定数は自クラスを参照し、その後、外側のクラスを参照する 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
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 …
require 'stringio' stringioの使い所がわからなかった。 http://itpro.nikkeibp.co.jp/article/COLUMN/20060314/232389/ まつもとゆきひろさんによると、 ログ出力のケースが挙げられている。 ファイルに書き込まずに、データベースやメモリ上など 多様な出…
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"
現在時刻 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…
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…
class String def hello self + "hello" end end オープンクラスでのメソッド定義は影響が大きすぎるため、 範囲を限定する為に、refinements を利用可能 ・ファイル内限定 ・usingはトップレベル、クラス、モジュール直下限定 ・メソッド内利用不可 class B…
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で割り切れる…
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) #…
破壊的メソッドのメソッド名には!がついているだけとは限らない リンク リンク !がつかなくても破壊的メソッドがある # Arrayの破壊的メソッドを引き続き覚えれば良い # 破壊的 # String#insert s = "string" s.insert(0, "long-") p s #=> "long-string" # …
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…