由于Ruby不支持重载(由于几个微不足道的原因),我试图找到一种"模拟"它的方法.
在静态类型语言中,您不得使用instanceof(当然除了某些特定情况......)来指导应用程序.
因此,记住这一点,这是重载一个方法的正确方法,在这个方法中我关心变量的类型吗?(在这种情况下,我不关心参数的数量)
class User
attr_reader :name, :car
end
class Car
attr_reader :id, :model
end
class UserComposite
attr_accessor :users
# f could be a name, or a car id
def filter(f)
if (f.class == Car)
filter_by_car(f)
else
filter_by_name(f)
end
end
private
def filter_by_name(name)
# filtering by name...
end
def filter_by_car(car)
# filtering by car id...
end
end
Run Code Online (Sandbox Code Playgroud)
有有情况下,这是一个很好的做法,和Ruby给你来对付它的工具.
但是你的情况不清楚,因为你的例子与自己相矛盾.如果f.class == Car那么filter_by_car接受a _car,而不是a _car_id.
我假设您实际上正在传递该类的实例,如果是这样,您可以这样做:
# f could be a name, or a car
def filter(f)
case f
when Car
filter_by_car(f)
else
filter_by_name(f)
end
end
Run Code Online (Sandbox Code Playgroud)
case [x]查看每个when [y]子句并执行第一个子句[y] === [x]
实际上这正在运行Car === f.当您调用#===类对象时,如果参数是类的实例,则返回true.
这是一个非常强大的构造,因为不同的类可以定义不同的"大小写相等".例如,如果参数与表达式匹配,则Regexp类将case等式定义为true,因此以下工作原理:
case "foo"
when Fixnum
# Doesn't run, the string isn't an instance of Fixnum
when /bar/
# Doesn't run, Regexp doesn't match
when /o+/
# Does run
end
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
197 次 |
| 最近记录: |