Objectクラスは全てのクラスのスーパークラス。また、ObjectクラスはKernelモジュールをインクルードしているため、全てのオブジェクトでKernelモジュールのメソッドを使用できる。
###オブジェクトID
> a = "bagu"
> a.object_id
=> 2115678909
> a.__id__
=> 2115678909
Rubyでは全てがオブジェクトであるため、同じリテラルであっても基本的にはオブジェクトIDは異なる。
しかし、TrueClass, FalseClass, NilClass, Symbol, Fixumクラスのインスタンスは、同じリテラルであれば、同じIDとなる。
> :bagu.class
=> String
> "bagu".object_id
=> 3212398798
> "bagu".object_id
=> 3212397653
> :bagu.class
=> Symbol
> :bagu.object_id
=> 3498473892
> :bagu.object_id
=> 3498473892 注.インスタンスの前に : をつけないとエラーになる。
###equal?メソッド / eql?メソッド
equal?メソッドはオブジェクトIDを比較、 eql?メソッドはハッシュのキーを比較する。
> a = "bagu"
=> "bagu"
> a.hash
=> 574895934
> a.object_id
=> 345678903
> b = "bagu"
=> "bagu"
> b.hash
=> 574895934 # ハッシュのキーは同じ
> b.object_id
=> 345673491 # IDは異なる
> a.eql?(b)
=> true
> a.equal?(b)
=> false
###オブジェクトのメソッド
irb(main):007:0> a.methods
=> [:include?, :%, :unicode_normalize, :*, :+, :to_c, :unicode_normalize!, :unicode_normalized?, :count, :partition, :unpack, :encode, :encode!, :next, :casecmp, :insert, :bytesize, :match, :succ!, :next!, :upto, :index, :rindex, :replace, :clear, :chr, :+@, :-@, :setbyte, :getbyte, :<=>, :<<, :scrub, :scrub!, :byteslice, :==, :===, :dump, :=~, :downcase, :[], :[]=, :upcase, :downcase!, :capitalize, :swapcase, :upcase!, :oct, :empty?, :eql?, :hex, :chars, :split, :capitalize!, :swapcase!, :concat, :codepoints, :reverse, :lines, :bytes, :prepend, :scan, :ord, :reverse!, :center, :sub, :freeze, :inspect, :intern, :end_with?, :gsub, :chop, :crypt, :gsub!, :start_with?, :rstrip, :sub!, :ljust, :length, :size, :strip!, :succ, :rstrip!, :chomp, :strip, :rjust, :lstrip!, :tr!, :chomp!, :squeeze, :lstrip, :tr_s!, :to_str, :to_sym, :chop!, :each_byte, :each_char, :each_codepoint, :to_s, :to_i, :tr_s, :delete, :encoding, :force_encoding, :sum, :delete!, :squeeze!, :tr, :to_f, :valid_encoding?, :slice, :slice!, :rpartition, :each_line, :b, :ascii_only?, :to_r, :hash, :<, :>, :<=, :>=, :between?, :instance_of?, :public_send, :instance_variable_get, :instance_variable_set, :instance_variable_defined?, :remove_instance_variable, :private_methods, :kind_of?, :instance_variables, :tap, :define_singleton_method, :is_a?, :public_method, :extend, :singleton_method, :to_enum, :enum_for, :!~, :respond_to?, :display, :object_id, :send, :method, :nil?, :class, :singleton_class, :clone, :dup, :itself, :taint, :tainted?, :untaint, :untrust, :trust, :untrusted?, :methods, :protected_methods, :frozen?, :public_methods, :singleton_methods, :!, :!=, :__send__, :equal?, :instance_eval, :instance_exec, :__id__]
irb(main):008:0> a.private_methods
=> [:initialize, :initialize_copy, :DelegateClass, :default_src_encoding, :irb_binding, :sprintf, :format, :Integer, :Float, :String, :Array, :Hash, :catch, :throw, :loop, :block_given?, :Rational, :trace_var, :untrace_var, :at_exit, :Complex, :set_trace_func, :select, :caller, :caller_locations, :test, :fork, :`, :exit, :sleep, :respond_to_missing?, :load, :syscall, :printf, :open, :putc, :print, :readline, :puts, :p, :exit!, :system, :readlines, :gets, :rand, :srand, :proc, :lambda, :gem_original_require, :initialize_clone, :initialize_dup, :exec, :trap, :spawn, :abort, :require, :require_relative, :autoload, :autoload?, :gem, :binding, :local_variables, :warn, :raise, :fail, :global_variables, :__method__, :__callee__, :__dir__, :eval, :iterator?, :method_missing, :singleton_method_added, :singleton_method_removed, :singleton_method_undefined]
irb(main):009:0> a.protected_methods
=> []
irb(main):010:0> a.public_methods
=> [:include?, :%, :unicode_normalize, :*, :+, :to_c, :unicode_normalize!, :unicode_normalized?, :count, :partition, :unpack, :encode, :encode!, :next, :casecmp, :insert, :bytesize, :match, :succ!, :next!, :upto, :index, :rindex, :replace, :clear, :chr, :+@, :-@, :setbyte, :getbyte, :<=>, :<<, :scrub, :scrub!, :byteslice, :==, :===, :dump, :=~, :downcase, :[], :[]=, :upcase, :downcase!, :capitalize, :swapcase, :upcase!, :oct, :empty?, :eql?, :hex, :chars, :split, :capitalize!, :swapcase!, :concat, :codepoints, :reverse, :lines, :bytes, :prepend, :scan, :ord, :reverse!, :center, :sub, :freeze, :inspect, :intern, :end_with?, :gsub, :chop, :crypt, :gsub!, :start_with?, :rstrip, :sub!, :ljust, :length, :size, :strip!, :succ, :rstrip!, :chomp, :strip, :rjust, :lstrip!, :tr!, :chomp!, :squeeze, :lstrip, :tr_s!, :to_str, :to_sym, :chop!, :each_byte, :each_char, :each_codepoint, :to_s, :to_i, :tr_s, :delete, :encoding, :force_encoding, :sum, :delete!, :squeeze!, :tr, :to_f, :valid_encoding?, :slice, :slice!, :rpartition, :each_line, :b, :ascii_only?, :to_r, :hash, :<, :>, :<=, :>=, :between?, :instance_of?, :public_send, :instance_variable_get, :instance_variable_set, :instance_variable_defined?, :remove_instance_variable, :private_methods, :kind_of?, :instance_variables, :tap, :define_singleton_method, :is_a?, :public_method, :extend, :singleton_method, :to_enum, :enum_for, :!~, :respond_to?, :display, :object_id, :send, :method, :nil?, :class, :singleton_class, :clone, :dup, :itself, :taint, :tainted?, :untaint, :untrust, :trust, :untrusted?, :methods, :protected_methods, :frozen?, :public_methods, :singleton_methods, :!, :!=, :__send__, :equal?, :instance_eval, :instance_exec, :__id__]
irb(main):011:0> a.singleton_methods
=> []
irb(main):012:0>
###オブジェクトの複製 :cloneメソッド
class Dog
attr_accessor :name
def initialize(name)
@name = name
end
end
original = Cat.new("Maro")
copied = original.clone
puts copied.equal?(original)
puts copied.neme
=>false
=>Maro
参照:Rubyリファレンス, https://ref.xaio.jp/ruby/classes/object/clone
###cloneとdup
cloneメソッドはオブジェクトの凍結状態、汚染状態、信頼状態をコピーする。dupメソッドは汚染状態と信頼状態をコピーするが、凍結状態はコピーしない。
cloneメソッドはオブジェクトの特異メソッドもコピーする。dupメソッドはコピーしない。
###インスタンス変数へのアクセス
> class Goo
> def initialize
> @hoge = 1
> end
> end
=> nil
> f = Goo.new
=> #<Goo:0x2020948390 @hoge=1>
> f.instance_variables #インスタンス変数の一覧
=> ["@hoge"]
> f.instance_variable_get(:@hoge) #インスタンス変数の取得
=> 1
>f.instance_variable_set(:@hoge, 2) #インスタンス変数の設定
=> 2
>f.instance_variable_get(:@hoge)
=> 2