module MyModule
class Parent
def initialize(a, b=nil)
begin
@my_var = b[:some_key]
rescue
@my_var = {}
end
end
end
end
module MyModule
class Child < Parent
def initialize(a, b=nil)
super a, b
begin
@my_var = b[:some_key]
rescue
@my_var = {:some_key => 'something more specific'}
end
end
end
end
我有两个类,我基本上使用begin / rescue / end将可选参数设置为实例变量。我知道我在这里使用异常处理来控制流程,我只是不知道另一种方式!如何将@my_var
设置为自身(非零)或空哈希?
我试过......
def initialize(a, b=nil)
b ||= {}
super
end
我想我的主要问题是我不明白可选的args和super
是如何工作的?我在模块中继承的事实会改变什么吗?
答案 0 :(得分:1)
如果没有传递参数,则使用默认值,因此您可以为子和父使用不同的默认值(因为super
显式传递了可选参数)。
实际上(正如@CarySwoveland所评论的那样)您甚至不必将参数写入super
,因为在没有参数的情况下编写super
会隐式传递原始参数。
module MyModule
class Parent
def initialize(a, b={})
@my_var = b[:some_key]
end
attr_accessor :my_var
end
end
module MyModule
class Child < Parent
def initialize(a, b={some_key: 'something more specific'})
super
end
end
end
MyModule::Parent.new('a').my_var
# => nil
MyModule::Child.new('a').my_var
# => "something more specific"
在2.0以后的ruby版本中,您可以使用Keyword Arguments更明确地执行相同的操作:
module MyModule
class Parent
def initialize(a, some_key: nil)
@my_var = some_key
end
attr_accessor :my_var
end
end
module MyModule
class Child < Parent
def initialize(a, some_key: 'something more specific')
super
end
end
end