-
Notifications
You must be signed in to change notification settings - Fork 311
/
Object
1865 lines (1373 loc) · 48.1 KB
/
Object
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
#@since 1.9.1
= class Object < BasicObject
#@else
= class Object
#@end
include Kernel
全てのクラスのスーパークラス。
オブジェクトの一般的な振舞いを定義します。
このクラスのメソッドは上書きしたり未定義にしない限り、すべてのオブジェクトで使用することができます。
== Class Methods
--- new -> Object
Objectクラスのインスタンスを生成して返します。
some = Object.new
p some #=> #<Object:0x2b696d8>
== Instance Methods
--- ==(other) -> bool
オブジェクトと other が等しければ真を返します。
このメソッドは各クラスの性質に合わせて再定義すべきです。
多くの場合、オブジェクトの内容が等しければ真を返すように
(同値性を判定するように)再定義されることが期待されています。
デフォルトでは equal? と同じオブジェクト
の同一性判定になっています。
@param other 比較するオブジェクトです。
p("foo" == "bar") #=> false
p("foo" == "foo") #=> true
p(4 == 4) #=> true
p(4 == 4.0) #=> true
@see [[m:Object#equal?]],[[m:Object#eql?]]
--- eql?(other) -> bool
オブジェクトと other が等しければ真を返します。[[c:Hash]] で二つのキー
が等しいかどうかを判定するのに使われます。
このメソッドは各クラスの性質に合わせて再定義すべきです。
多くの場合、 == と同様に同値性の判定をするように再定義されていますが、
適切にキー判定ができるようにより厳しくなっている場合もあります。
デフォルトでは equal? と同じオブジェクト
の同一性判定になっています。
このメソッドを再定義した時には [[m:Object#hash]] メソッ
ドも再定義しなければなりません。
@param other 比較するオブジェクトです。
p("foo".eql?("bar")) #=> false
p("foo".eql?("foo")) #=> true
p(4.eql?(4)) #=> true
p(4.eql?(4.0)) #=> false
@see [[m:Object#hash]],[[m:Object#equal?]],[[m:Object#==]]
--- equal?(other) -> bool
other が self 自身の時、真を返します。
二つのオブジェクトが同一のものかどうか調べる時に使用します。
このメソッドを再定義してはいけません。
お互いの[[m:Object#object_id]]が一致する
かどうかを調べます。
@param other 比較するオブジェクトです。
p("foo".equal?("bar")) #=> false
p("foo".equal?("foo")) #=> false
p(4.equal?(4)) #=> true
p(4.equal?(4.0)) #=> false
p(:foo.equal? :foo) #=> true
@see [[m:Object#object_id]],[[m:Object#==]],[[m:Object#eql?]],[[c:Symbol]]
#@since 1.9.1
--- methods(include_inherited = true) -> [Symbol]
#@else
#@since 1.8.0
--- methods(include_inherited = true) -> [String]
#@else
--- methods -> [String]
[[m:Module#instance_methods]] と同じです。
#@end
#@end
#@since 1.8.0
そのオブジェクトに対して呼び出せるメソッド名の一覧を返します。
このメソッドは public メソッドおよび protected メソッドの名前を返します。
ただし特別に、引数が偽の時は [[m:Object#singleton_methods]](false) と同じになっています。
#@end
#@if (version > "1.8.0")
#@since 1.8.0
@param include_inherited 引数が偽の時は [[m:Object#singleton_methods]](false) と同じになります。
#@end
#例1:
class Parent
private; def private_parent() end
protected; def protected_parent() end
public; def public_parent() end
end
class Foo < Parent
private; def private_foo() end
protected; def protected_foo() end
public; def public_foo() end
end
obj = Foo.new
class <<obj
private; def private_singleton() end
protected; def protected_singleton() end
public; def public_singleton() end
end
# あるオブジェクトの応答できるメソッドの一覧を得る。
p obj.methods(false)
p obj.public_methods(false)
p obj.private_methods(false)
p obj.protected_methods(false)
#実行結果
#@since 1.9.1
[:protected_singleton, :public_singleton]
[:public_singleton, :public_foo]
[:private_singleton, :private_foo]
[:protected_singleton, :protected_foo]
#@else
["public_singleton", "protected_singleton"]
["public_foo", "public_singleton"]
["private_foo", "private_singleton"]
["protected_foo", "protected_singleton"]
#@end
#例2:
# あるオブジェクトの応答できるメソッドの一覧を得る。
# 自身のクラスの親クラスのインスタンスメソッドも含めるために true を指定して
# いるが、Object のインスタンスメソッドは一覧から排除している。
p obj.methods(true) - Object.instance_methods(true)
p obj.public_methods(true) - Object.public_instance_methods(true)
p obj.private_methods(true) - Object.private_instance_methods(true)
p obj.protected_methods(true) - Object.protected_instance_methods(true)
#実行結果
#@since 1.9.1
[:protected_singleton, :public_singleton, :protected_foo, :public_foo, :protected_parent, :public_parent]
[:public_singleton, :public_foo, :public_parent]
[:private_singleton, :private_foo, :private_parent]
[:protected_singleton, :protected_foo, :protected_parent]
#@else
["public_foo", "public_parent", "protected_singleton", "public_singleton", "protected_foo", "protected_parent"]
["public_foo", "public_parent", "public_singleton"]
["private_singleton", "private_foo", "private_parent"]
["protected_singleton", "protected_foo", "protected_parent"]
#@end
#@end
@see [[m:Module#instance_methods]],[[m:Object#singleton_methods]]
#@since 1.9.1
--- public_methods(include_inherited = true) -> [Symbol]
#@else
#@since 1.8.0
--- public_methods(include_inherited = true) -> [String]
#@else
--- public_methods -> [String]
#@end
#@end
そのオブジェクトが理解できる public メソッド名の一覧を返します。
#@since 1.8.0
@param include_inherited 偽となる値を指定すると自身のクラスのスーパークラスで定義されたメソッドを除きます。
#@end
@see [[m:Module#public_instance_methods]],[[m:Object#methods]],[[m:Object#singleton_methods]]
#@since 1.9.1
--- private_methods(include_inherited = true) -> [Symbol]
#@else
#@since 1.8.0
--- private_methods(include_inherited = true) -> [String]
#@else
--- private_methods -> [String]
#@end
#@end
そのオブジェクトが理解できる private メソッド名の一覧を返します。
#@since 1.8.0
@param include_inherited 偽となる値を指定すると自身のクラスのスーパークラスで定義されたメソッドを除きます。
#@end
@see [[m:Module#private_instance_methods]],[[m:Object#methods]],[[m:Object#singleton_methods]]
#@since 1.9.1
--- protected_methods(include_inherited = true) -> [Symbol]
#@else
#@since 1.8.0
--- protected_methods(include_inherited = true) -> [String]
#@else
--- protected_methods -> [String]
#@end
#@end
そのオブジェクトが理解できる protected メソッド名の一覧を返します。
#@since 1.8.0
@param include_inherited 偽となる値を指定すると自身のクラスのスーパークラスで定義されたメソッドを除きます。
#@end
@see [[m:Module#protected_instance_methods]],[[m:Object#methods]],[[m:Object#singleton_methods]]
#@since 1.9.1
--- singleton_methods(inherited_too = true) -> [Symbol]
#@else
#@if (version > "1.8.0")
--- singleton_methods(inherited_too = true) -> [String]
#@end
#@if (version == "1.8.0")
--- singleton_methods(inherited_too = false) -> [String]
#@end
#@if (version < "1.8.0")
--- singleton_methods -> [String]
そのオブジェクトに対して定義されている特異メソッド名
(publicメソッドのみ) の一覧を返します。
#@end
#@end
#@since 1.8.0
そのオブジェクトに対して定義されている特異メソッド名
(public あるいは protected メソッド) の一覧を返します。
クラスメソッド([[c:Class]]のインスタンスの特異メソッド)に関しては
引数が真のとき、スーパークラスのクラスメソッドも対象になります。
singleton_methods(false) は、[[m:Object#methods]](false) と同じです。
#@end
#@if (version > "1.8.0")
#@#@param inherited_too 偽を表す値を指定すると自身のクラスのスーパークラスで定義されたメソッドを除きます。
@param inherited_too 引数が真のとき、スーパークラスのクラスメソッドも対象になります。これが意味を持つのは
self がクラスオブジェクトであるときだけです。
#例1:
Parent = Class.new
class <<Parent
private; def private_class_parent() end
protected; def protected_class_parent() end
public; def public_class_parent() end
end
Foo = Class.new(Parent)
class <<Foo
private; def private_class_foo() end
protected; def protected_class_foo() end
public; def public_class_foo() end
end
module Bar
private; def private_bar() end
protected; def protected_bar() end
public; def public_bar() end
end
obj = Foo.new
class <<obj
include Bar
private; def private_self() end
protected; def protected_self() end
public; def public_self() end
end
# あるオブジェクトの特異メソッドの一覧を得る。
p obj.singleton_methods(false)
p obj.methods(false)
p Foo.singleton_methods(false)
#実行結果
#@since 1.9.1
[:protected_self, :public_self]
[:protected_self, :public_self]
[:protected_class_foo, :public_class_foo]
#@else
["public_self", "protected_self"]
["public_self", "protected_self"]
["public_class_foo", "protected_class_foo"]
#@end
#例2:
# あるオブジェクトの特異メソッドの一覧を得る。
# 親クラスのクラスメソッドも含まれるよう true を指定したが、
# Object のクラスメソッドは一覧から排除している。
p obj.singleton_methods(true)
p Foo.singleton_methods(true) - Object.singleton_methods(true)
#実行結果
#@since 1.9.1
[:protected_self, :public_self, :protected_bar, :public_bar]
[:protected_class_foo, :public_class_foo, :protected_class_parent, :public_class_parent]
#@else
["public_bar", "public_self", "protected_bar", "protected_self"]
["public_class_foo", "public_class_parent", "protected_class_foo", "protected_class_parent"]
#@end
#@end
@see [[m:Object#methods]],[[m:Object#extend]]
#@since 1.9.1
--- to_splat -> Array
#@#nomethod
オブジェクトの [[c:Array]] への暗黙の変換が必要なときに内部で呼ばれます。
デフォルトでは定義されていません。`*'による配列展開の実体です。
説明のためここに記載してありますが、
このメソッドは実際には Object クラスには定義されていません。
必要に応じてサブクラスで定義すべきものです。
メソッド呼び出し時の引数や、
多重代入の右辺値に`*'をつけて配列変換を行ったときに内部で呼ばれます。
class Foo
def to_ary
[1,2,3]
end
def to_splat
[4,5,6]
end
end
a,b = *Foo.new
p [a,b] #=> [4, 5]
a,b = Foo.new
p [a,b] #=> [1, 2]
def doi(a,*b)
p b
end
doi(*Foo.new) #=> [5, 6]
@see [[m:Object#to_ary]],[[m:Object#to_a]],[[m:Kernel.#Array]]
#@end
--- to_a -> Array
#@#nomethod
オブジェクトを配列に変換した結果を返します。
#@since 1.9.1
デフォルトでは定義されていません。
説明のためここに記載してありますが、
このメソッドは実際には Object クラスには定義されていません。
必要に応じてサブクラスで定義すべきものです。
#@else
配列に変換できない(to_ary を持たない)オブジェクトは、自身のみを含む長さ 1 の配
列に変換されます。
このメソッドは、将来 Object のメソッドからは取り除かれます。
なので to_a を使用する場合、
* すべてのオブジェクトに to_a が定義されているという期待はしない。
* ユーザー定義のクラスには必要に応じて自分で定義する
などということが必要です。
#@end
#@since 1.9.1
p( {'a'=>1}.to_a ) # [["a", 1]]
p ['array'].to_a # ["array"]
p nil.to_a # []
@see [[m:Object#to_ary]],[[m:Object#to_splat]],[[m:Kernel.#Array]]
#@else
p( {'a'=>1}.to_a ) # [["a", 1]]
p ['array'].to_a # ["array"]
p 1.to_a # [1] (warning: default `to_a' will be obsolete)
p nil.to_a # []
@see [[m:Object#to_ary]],[[m:Kernel.#Array]]
#@end
--- to_s -> String
オブジェクトの文字列表現を返します。
[[m:Kernel.#print]] や [[m:Kernel.#sprintf]] は文字列以外の
オブジェクトが引数に渡された場合このメソッドを使って文字列に変換し
ます。
class Foo
def initialize num
@num = num
end
end
it = Foo.new(40)
puts it #=> #<Foo:0x2b69110>
class Foo
def to_s
"Class:Foo Number:#{@num}"
end
end
puts it #=> Class:Foo Number:40
@see [[m:Object#to_str]],[[m:Kernel.#String]]
--- to_str -> String
#@#nomethod
オブジェクトの [[c:String]] への暗黙の変換が必要なときに内部で呼ばれます。
デフォルトでは定義されていません。
説明のためここに記載してありますが、
このメソッドは実際には Object クラスには定義されていません。
必要に応じてサブクラスで定義すべきものです。
このメソッドを定義する条件は、
* 文字列が使われるすべての場面で代置可能であるような、
* 文字列そのものとみなせるようなもの
という厳しいものになっています。
class Foo
def to_str
'Edition'
end
end
it = Foo.new
p('Second' + it) #=> "SecondEdition"
@see [[m:Object#to_s]],[[m:Kernel.#String]]
--- to_ary -> Array
#@#nomethod
オブジェクトの [[c:Array]] への暗黙の変換が必要なときに内部で呼ばれます。
デフォルトでは定義されていません。
説明のためここに記載してありますが、
このメソッドは実際には Object クラスには定義されていません。
必要に応じてサブクラスで定義すべきものです。
このメソッドを定義する条件は、
* 配列が使われるすべての場面で代置可能であるような、
* 配列そのものとみなせるようなもの
という厳しいものになっています。
class Foo
def to_ary
[3,4]
end
end
it = Foo.new
p([1,2] + it) #=> [1, 2, 3, 4]
#@since 1.9.1
@see [[m:Object#to_splat]],[[m:Object#to_a]],[[m:Kernel.#Array]]
#@else
@see [[m:Object#to_a]],[[m:Kernel.#Array]]
#@end
--- to_hash -> Hash
#@#nomethod
オブジェクトの [[c:Hash]] への暗黙の変換が必要なときに内部で呼ばれます。
デフォルトでは定義されていません。
説明のためここに記載してありますが、
このメソッドは実際には Object クラスには定義されていません。
必要に応じてサブクラスで定義すべきものです。
このメソッドを定義する条件は、
* ハッシュが使われるすべての場面で代置可能であるような、
* ハッシュそのものとみなせるようなもの
という厳しいものになっています。
class Foo
def to_hash
{'as' => 24}
end
end
it = Foo.new
p({:as => 12}.merge(it)) #=> {"as"=>24, :as=>12}
--- to_int -> Integer
#@#nomethod
オブジェクトの [[c:Integer]] への暗黙の変換が必要なときに内部で呼ばれます。
デフォルトでは定義されていません。
説明のためここに記載してありますが、
このメソッドは実際には Object クラスには定義されていません。
必要に応じてサブクラスで定義すべきものです。
このメソッドを定義する条件は、
* 整数が使われるすべての場面で代置可能であるような、
* 整数そのものとみなせるようなもの
という厳しいものになっています。
class Foo
def to_int
666
end
end
it = Foo.new
p(9**9 & it) #=> 8
@see [[m:Kernel.#Integer]]
--- to_proc -> Proc
#@#nomethod
オブジェクトの [[c:Proc]] への暗黙の変換が必要なときに内部で呼ばれます。
デフォルトでは定義されていません。
説明のためここに記載してありますが、
このメソッドは実際には Object クラスには定義されていません。
必要に応じてサブクラスで定義すべきものです。
def doing
yield
end
class Foo
def to_proc
Proc.new{p 'ok'}
end
end
it = Foo.new
doing(&it) #=> "ok"
--- to_io -> IO
#@#nomethod
オブジェクトの [[c:IO]] への暗黙の変換が必要なときに内部で呼ばれます。
デフォルトでは定義されていません。
説明のためここに記載してありますが、
このメソッドは実際には Object クラスには定義されていません。
必要に応じてサブクラスで定義すべきものです。
このメソッドを定義する条件は、
* IOオブジェクトが使われるすべての場面で代置可能であるような、
* IOオブジェクトそのものとみなせるようなもの
という厳しいものになっています。
#@#例
--- to_regexp -> Regexp
#@#nomethod
オブジェクトの [[c:Regexp]] への暗黙の変換が必要なときに内部で呼ばれます。
デフォルトでは定義されていません。
説明のためここに記載してありますが、
このメソッドは実際には Object クラスには定義されていません。
必要に応じてサブクラスで定義すべきものです。
このメソッドを定義する条件は、
* 正規表現が使われるすべての場面で代置可能であるような、
* 正規表現そのものとみなせるようなもの
という厳しいものになっています。
class Foo
def to_regexp
/[\d]+/
end
end
it = Foo.new
p Regexp.union(/^at/, it) #=> /(?-mix:^at)|(?-mix:[\d]+)/
#@since 1.8.7
#@since 1.8.8
--- to_enum(method = :each, *args) -> Enumerator
--- enum_for(method = :each, *args) -> Enumerator
[[m:Enumerator.new]](self, method, *args) を返します。
#@else
--- to_enum(method = :each, *args) -> Enumerable::Enumerator
--- enum_for(method = :each, *args) -> Enumerable::Enumerator
[[m:Enumerable::Enumerator.new]](self, method, *args) を返します。
#@end
@param method メソッド名の文字列かシンボルです。
@param args 呼び出すメソッドに渡される引数です。
@raise NameError 存在しないメソッド名を指定すると発生します。
str = "xyz"
enum = str.enum_for(:each_byte)
p(a = enum.map{|b| '%02x' % b }) #=> ["78", "79", "7a"]
# protects an array from being modified
a = [1, 2, 3]
#@since 1.8.8
p(a.to_enum) #=> #<Enumerator: [1, 2, 3]:each>
#@else
p(a.to_enum) #=> #<Enumerable::Enumerator:0xbaf7ac>
#@end
#@since 1.8.8
@see [[c:Enumerator]]
#@else
@see [[c:Enumerable::Enumerator]]
#@end
--- tap{|x| ... } -> self
self を引数としてブロックを評価し、self を返します。
メソッドチェインの途中で直ちに操作結果を表示するために
メソッドチェインに "入り込む" ことが、このメソッドの主目的です。
(1..10) .tap {|x| puts "original: #{x.inspect}"}.
to_a .tap {|x| puts "array: #{x.inspect}"}.
select {|x| x % 2 == 0} .tap {|x| puts "evens: #{x.inspect}"}.
map { |x| x * x } .tap {|x| puts "squares: #{x.inspect}"}
#@end
--- __id__ -> Integer
--- object_id -> Integer
#@if (version < "1.9.1")
--- id -> Integer
#@end
各オブジェクトに対して一意な整数を返します。あるオブジェクトに対し
てどのような整数が割り当てられるかは不定です。
Rubyでは、(Garbage Collectされていない)アクティブなオブジェクト間で
重複しない整数(object_id)が各オブジェクトにひとつずつ割り当てられています。この
メソッドはその値を返します。
[[c:TrueClass]], [[c:FalseClass]], [[c:NilClass]], [[c:Symbol]], [[c:Fixnum]] クラス
のインスタンスなど Immutable(変更不可)なオブジェクトの一部は同じ内容ならば必ず同じ object_id になります。
これは、Immutable ならば複数の場所から参照されても`破壊的操作'による問題が発生しないので、
同じ内容のインスタンスを複数生成しないという内部実装が理由です。
#@if (version < "1.9.1")
[[m:Symbol#to_i]]で得られる整数と object_id は別物です。
id メソッドの再定義に備えて別名 __id__ が用意されて
おり、ライブラリでは後者の利用が推奨されます。また __id__ を
再定義すべきではありません。
id は obsolete なので、object_id か __id__ を使用してください。
#@end
p "ruby".object_id #=> 22759500
p "ruby".object_id #=> 22759400
p [].object_id #=> 22759360
p [].object_id #=> 22759340
p :ruby.object_id #=> 103538
p :ruby.object_id #=> 103538
p 11.object_id #=> 23
p 11.object_id #=> 23
p true.object_id #=> 2
p true.object_id #=> 2
@see [[m:Object#equal?]],[[c:Symbol]]
--- hash -> Fixnum
オブジェクトのハッシュ値を返します。[[c:Hash]] クラスでオブジェク
トを格納するのに用いられています。
メソッド hash は [[m:Object#eql?]] と組み合わせて Hash クラスで利用されます。その際
A.eql?(B) ならば A.hash == B.hash
の関係を必ず満たしていなければいけません。eql? を再定義した時には必ずこちらも合わせ
て再定義してください。
デフォルトでは、[[m:Object#object_id]] と同じ値を返します。
ただし、[[c:Fixnum]], [[c:Symbol]], [[c:String]] だけは組込みのハッ
シュ関数が使用されます(これを変えることはできません)。
hash を再定義する場合は、一様に分布する任意の整数を返すようにします。
@return ハッシュ値を返します。Fixnumに収まらない場合は切り捨てられます。
p self.hash #=> 21658870
p 0.hash #=> 1
p 0.0.hash #=> 0
p nil.hash #=> 4
p "ruby".hash #=> -241670986
p "ruby".hash #=> -241670986
p :ruby.hash #=> 103538
p :ruby.hash #=> 103538
@see [[m:Object#eql?]],[[m:Object#__id__]]
--- ===(other) -> bool
メソッド [[m:Object#==]] の別名です。
case 節で使用されます。このメソッドは case 節での振る舞いを考慮して、
各クラスの性質に合わせて再定義すべきです。
一般的に所属性のチェックを実現するため適宜再定義されます。
when 節の式をレシーバーとして === を呼び出すことに注意してください。
@param other 比較するオブジェクトです。
age = 12
result =
case age
when 0 .. 2
"baby"
when 3 .. 6
"little child"
when 7 .. 12
"child"
when 13 .. 18
"youth"
else
"adult"
end
puts result #=> "child"
def check arg
case arg
when /ruby(?!\s*on\s*rails)/i
"hit! #{arg}"
when String
"Instance of String class.But don't hit."
else
"unknown"
end
end
puts check([]) #=> unknown
puts check("mash-up in Ruby on Rails") #=> instance of String class.but not hit...
puts check("<Ruby's world>") #=> hit! <Ruby's world>
@see [[m:Object#==]], [[m:Range#===]], [[m:Module#===]]
--- =~(other) -> false
右辺に正規表現オブジェクトを置いた正規表現マッチ obj =~ /RE/
をサポートするためのメソッドです。常に false を返します。
この定義により、=~ が再定義されたオブジェクトでは正常にマッチを行い、
それ以外のものは false を返すようになります。
#@#obj が文字列なのを期待していたが nil だった場合などにエラーを発生させずに正常に false を返すことができます。
@param other 任意のオブジェクトです。結果に影響しません。
obj = 'regexp'
p(obj =~ /re/) #=> 0
obj = nil
p(obj =~ /re/) #=> false
@see [[m:String#=~]]
--- display(out = $stdout) -> nil
オブジェクトを out に出力します。以下のように定義されています。
class Object
def display(out = $stdout)
out.print self.to_s
nil
end
end
@param out 出力先のIOオブジェクトです。指定しない場合は標準出力に出力されます。
@return nil を返します。
Object.new.display #=> #<Object:0xbb0210>
@see [[m:$stdout]]
--- extend(*modules) -> self
引数で指定したモジュールのインスタンスメソッドを self の特異
メソッドとして追加します。
[[m:Module#include]] は、クラス(のインスタンス)に機能を追加します
が、extend は、ある特定のオブジェクトだけにモジュールの機能を追加
したいときに使用します。
#@if (version >= "1.8.0")
引数に複数のモジュールを指定した場合、最後
の引数から逆順に extend を行います。
#@end
@param modules モジュールを任意個指定します(クラスは不可)。
@return self を返します。
module Foo
def a
'ok Foo'
end
end
module Bar
def b
'ok Bar'
end
end
obj = Object.new
obj.extend Foo, Bar
p obj.a #=> "ok Foo"
p obj.b #=> "ok Bar"
class Klass
include Foo
extend Bar
end
p Klass.new.a #=> "ok Foo"
p Klass.b #=> "ok Bar"
extend の機能は、「特異クラスに対する [[m:Module#include]]」
と言い替えることもできます。
#@since 1.8.0
ただしその場合、フック用のメソッド
が [[m:Module#extended]] ではなく [[m:Module#included]] になるという違いがあります。
#@end
# obj.extend Foo, Bar とほぼ同じ
class << obj
include Foo, Bar
end
#@since 1.8.0
@see [[m:Module#extend_object]],[[m:Module#include]],[[m:Module#extended]]
#@else
@see [[m:Module#extend_object]],[[m:Module#include]]
#@end
--- inspect -> String
オブジェクトを人間が読める形式に変換した文字列を返します。
組み込み関数 [[m:Kernel.#p]] は、このメソッドの結果を使用して
オブジェクトを表示します。
puts Class.new.inspect #=> #<Class:0xbafd88>
puts Time.now.inspect #=> 2007-10-15 21:01:37 +0900
@see [[m:Kernel.#p]]
#@if (version >= "1.8.0")
--- instance_variable_get(var) -> object|nil
オブジェクトのインスタンス変数の値を取得して返します。
インスタンス変数が定義されていなければ nil を返します。
@param var インスタンス変数名を文字列か [[c:Symbol]] で指定します。
class Foo
def initialize
@foo = 1
end
end
obj = Foo.new
p obj.instance_variable_get("@foo") #=> 1
p obj.instance_variable_get(:@foo) #=> 1
p obj.instance_variable_get(:@bar) #=> nil
#@since 1.8.6
@see [[m:Object#instance_variable_set]],[[m:Object#instance_variables]],[[m:Object#instance_variable_defined?]]
#@else
@see [[m:Object#instance_variable_get]],[[m:Object#instance_variables]]
#@end
#@end
#@if (version >= "1.8.0")
--- instance_variable_set(var, value) -> object
オブジェクトのインスタンス変数 var に値 value を設定します。
インスタンス変数が定義されていなければ新たに定義されます。
@param var インスタンス変数名を文字列か [[c:Symbol]] で指定します。
@param value 設定する値です。
@return value を返します。
obj = Object.new
p obj.instance_variable_set("@foo", 1) #=> 1
p obj.instance_variable_set(:@foo, 2) #=> 2
p obj.instance_variable_get(:@foo) #=> 2
#@since 1.8.6
@see [[m:Object#instance_variable_get]],[[m:Object#instance_variables]],[[m:Object#instance_variable_defined?]]
#@else
@see [[m:Object#instance_variable_get]],[[m:Object#instance_variables]]
#@end
#@end
--- instance_variables -> [String]
オブジェクトのインスタンス変数名を文字列の配列として返します。
obj = Object.new
obj.instance_eval { @foo, @bar = nil }
p obj.instance_variables
#=> ["@foo", "@bar"]
@see [[m:Object#instance_variable_get]],[[m:Kernel.#local_variables]],[[m:Kernel.#global_variables]],[[m:Module.constants]],[[m:Module#constants]],[[m:Module#class_variables]]
#@since 1.8.6
--- instance_variable_defined?(var) -> bool
インスタンス変数 var が定義されていたら真を返します。
@param var インスタンス変数名を文字列か [[c:Symbol]] で指定します。
class Fred
def initialize(p1, p2)
@a, @b = p1, p2
end
end
fred = Fred.new('cat', 99)
p fred.instance_variable_defined?(:@a) #=> true
p fred.instance_variable_defined?("@b") #=> true
p fred.instance_variable_defined?("@c") #=> false
@see [[m:Object#instance_variable_get]],[[m:Object#instance_variable_set]],[[m:Object#instance_variables]]
#@end
--- send(name, *args) -> object
--- send(name, *args) { .... } -> object
--- __send__(name, *args) -> object
--- __send__(name, *args) { .... } -> object
オブジェクトのメソッド name を args を引数に
して呼び出し、メソッドの実行結果を返します。
ブロック付きで呼ばれたときはブロックもそのまま引き渡します。
send が再定義された場合に備えて別名 __send__ も
用意されており、ライブラリではこちらを使うべきです。また
__send__ は再定義すべきではありません。
send, __send__ は、メソッドの呼び出し制限
にかかわらず任意のメソッドを呼び出せます。
[[ref:d:spec/def#limit]] も参照してください。
@param name 文字列か[[c:Symbol]] で指定するメソッド名です。
@param args 呼び出すメソッドに渡す引数です。
p -365.send(:abs) #=> 365
p "ruby".send(:sub,/./,"R") #=> "Ruby"
class Foo
def foo() "foo" end
def bar() "bar" end