Skip to content

Commit 7d35944

Browse files
Watson1978claude
andcommitted
Module: refinements 系 3 個と set_temporary_name を追加
実機で登場バージョンを確認し、それぞれ #@SInCE で分岐した。 3.2 で追加: Module#refinements self 内で定義された Refinement の一覧 Module.used_refinements 現在のスコープで using されている Refinement Module#undefined_instance_methods undef_method で未定義にしたメソッドの一覧 3.3 で追加: Module#set_temporary_name 一時的な名前の設定 配置は関連するメソッドの近くにした。used_refinements は対になる Module.used_modules の直後、refinements は instance_methods 系の後、 set_temporary_name は Module#name の直後に置いている。 set_temporary_name は制約が多いため、実機で確認したうえで記述した。 "Foo" や "Foo::Bar" のようにクラスパスとして有効な文字列は ArgumentError、 空文字列も ArgumentError、既に永続的な名前を持つモジュールに対しては RuntimeError になる。また定数に代入して永続的な名前が付くと一時的な名前が 破棄されることも例で示した。 used_refinements については、Module.used_modules がモジュール自体を返すのに 対しこちらは Refinement を返す、という違いが分かるように記述した。 bitclust のデータベース生成を 3.1 / 3.2 / 3.3 / 4.0 で実行してエラーが 出ないこと、および 3.1 では 4 件とも未登録、3.2 では 3 件、3.3 以降で 4 件 すべてが登録されることを確認済み。 Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
1 parent 4703a68 commit 7d35944

1 file changed

Lines changed: 131 additions & 0 deletions

File tree

manual/api/_builtin/Module.md

Lines changed: 131 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,35 @@ p Module.used_modules
9393
#=> [B, A]
9494
```
9595

96+
#@since 3.2
97+
### def used_refinements -> [Refinement]
98+
99+
現在のスコープで using されているすべての [c:Refinement] を配列で返します。
100+
配列内の順番は未定義です。
101+
102+
[m:Module.used_modules] が refinement を定義しているモジュール自体を返すのに対し、
103+
このメソッドは refinement そのものを返します。
104+
105+
```ruby title="例"
106+
module A
107+
refine Object do
108+
end
109+
end
110+
111+
module B
112+
refine Object do
113+
end
114+
end
115+
116+
using A
117+
using B
118+
p Module.used_refinements
119+
#=> [#<refinement:Object@B>, #<refinement:Object@A>]
120+
```
121+
122+
- **SEE** [m:Module.used_modules], [m:Module#refinements]
123+
#@end
124+
96125
## Instance Methods
97126

98127
### def <=>(other) -> -1 | 0 | 1 | nil
@@ -975,6 +1004,61 @@ p c.name #=> "Foo"
9751004
p c.name.frozen? #=> true
9761005
```
9771006

1007+
#@since 3.3
1008+
### def set_temporary_name(string) -> self
1009+
### def set_temporary_name(nil) -> self
1010+
1011+
モジュール / クラスに一時的な名前を設定します。self を返します。
1012+
1013+
設定した名前は [m:Module#name][m:Module#inspect] の結果に反映され、
1014+
そのモジュール / クラスのインスタンスや定数、メソッドの表示にも使われます。
1015+
定数に代入せずに、動的に生成したモジュール / クラスを区別したい場合に便利です。
1016+
1017+
引数に nil を指定すると、再び無名の状態に戻ります。
1018+
1019+
定数に代入されて永続的な名前が付くと、一時的な名前は破棄されます。
1020+
また、既に永続的な名前を持つモジュール / クラスには設定できません。
1021+
1022+
- **param** `string` -- 一時的な名前を文字列で指定します。
1023+
永続的な名前と紛らわしくならないよう、クラスパスとして
1024+
有効な文字列は指定できません。nil を指定すると無名に戻ります。
1025+
1026+
- **raise** `ArgumentError` -- string がクラスパスとして有効な文字列(`Foo`
1027+
`Foo::Bar` など)である場合や、空文字列である場合に発生します。
1028+
1029+
- **raise** `RuntimeError` -- 既に永続的な名前を持つモジュール / クラスに対して
1030+
呼び出した場合に発生します。
1031+
1032+
```ruby title="例"
1033+
m = Module.new
1034+
p m.name # => nil
1035+
1036+
m.set_temporary_name("<my temp>")
1037+
p m.name # => "<my temp>"
1038+
1039+
m.set_temporary_name(nil)
1040+
p m.name # => nil
1041+
```
1042+
1043+
```ruby title="例: 定数に代入すると永続的な名前になる"
1044+
m = Module.new
1045+
m.set_temporary_name("<my temp>")
1046+
p m.name # => "<my temp>"
1047+
1048+
MyModule = m
1049+
p m.name # => "MyModule"
1050+
```
1051+
1052+
```ruby title="例: 設定できない名前"
1053+
Module.new.set_temporary_name("Foo") # ~> ArgumentError
1054+
Module.new.set_temporary_name("Foo::Bar") # ~> ArgumentError
1055+
Module.new.set_temporary_name("") # ~> ArgumentError
1056+
String.set_temporary_name("<x>") # ~> RuntimeError
1057+
```
1058+
1059+
- **SEE** [m:Module#name]
1060+
#@end
1061+
9781062
### def instance_methods(inherited_too = true) -> [Symbol]
9791063

9801064
そのモジュールで定義されている public および protected メソッド名
@@ -1031,6 +1115,53 @@ p Dog.protected_instance_methods(true) - Object.protected_instance_methods(true)
10311115
[:protected_foo]
10321116
```
10331117

1118+
#@since 3.2
1119+
### def undefined_instance_methods -> [Symbol]
1120+
1121+
そのモジュールで [m:Module#undef_method] によって未定義にされた
1122+
インスタンスメソッド名の一覧を配列で返します。
1123+
1124+
祖先で未定義にされたメソッドは含まれません。
1125+
1126+
```ruby title="例"
1127+
class Foo
1128+
def bar; end
1129+
def baz; end
1130+
end
1131+
1132+
class Sub < Foo
1133+
undef bar
1134+
end
1135+
1136+
p Sub.undefined_instance_methods # => [:bar]
1137+
p Foo.undefined_instance_methods # => []
1138+
```
1139+
1140+
- **SEE** [m:Module#undef_method], [m:Module#instance_methods]
1141+
#@end
1142+
1143+
#@since 3.2
1144+
### def refinements -> [Refinement]
1145+
1146+
self の中で [m:Module#refine] によって定義された [c:Refinement]
1147+
一覧を配列で返します。
1148+
1149+
```ruby title="例"
1150+
module A
1151+
refine Integer do
1152+
end
1153+
1154+
refine String do
1155+
end
1156+
end
1157+
1158+
p A.refinements
1159+
#=> [#<refinement:Integer@A>, #<refinement:String@A>]
1160+
```
1161+
1162+
- **SEE** [m:Module#refine], [m:Module.used_refinements]
1163+
#@end
1164+
10341165
### def public_instance_method(name) -> UnboundMethod
10351166

10361167
self の public インスタンスメソッド name をオブジェクト化した [c:UnboundMethod] を返します。

0 commit comments

Comments
 (0)