避免Ruby中的方法重载

Qua*_*tum 1 ruby overloading

由于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)

Gar*_*eth 5

情况下,这是一个很好的做法,和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)