Ruby:一个方法可以返回不同类型的对象吗?

wvyml7n5  于 2023-02-18  发布在  Ruby
关注(0)|答案(1)|浏览(117)

返回一个类型根据方法的内部逻辑而改变的对象是一个好主意吗?
例如:

class Error
  attr_reader :details

  def initialize(details)
    @details = details
  end
end

def div(a, b)
  return Error.new("error: division by zero") if b == 0
  a / b
end

# declare foo, bar here
result = div(foo, bar)
if result.is_a?(Error)
  puts result.details
else
  puts "result of division: #{result}"
end

可以看出,div方法返回一个Error示例或一个Integer示例。
这是一种不好的做法(为什么)?它是否违反了单一责任原则?
顺便说一句,我知道另一个选项是返回一个哈希{error:错误,div_结果:div_result},但我很好奇它是否可以仅用一个对象替换。
谢谢你。

hc2pp10m

hc2pp10m1#

Ruby已经有了Exception Handling,而且它还包含一个ZeroDivisionError,当整数被零除时,ZeroDivisionError会增加:

def div(a, b)
  a / b
end

begin
  result = div(6, 0)
  puts "result of division: #{result}"
rescue ZeroDivisionError => e
  puts "error: #{e.message}"
end

# prints "error: divided by 0"

请注意,您的div方法也不是必需的,您也可以编写result = 6 / 0
返回一个类型根据方法的内部逻辑而改变的对象是一个好主意吗?
“type”在Ruby中是一个很难理解的术语。我猜你指的是“某个特定类的示例”之类的东西,比如整数或字符串?这要看情况而定。对于大多数方法来说,这肯定是个好主意,但也有一些例外。
例如,Integer#+返回基于其参数的结果:(您可能会认为这些都是Numeric的子类)
String#index通常返回整数,但也可能返回nil以指示“未找到”:

"hello".index("o") #=> 4     (Integer)
"hello".index("x") #=> nil   (NilClass)

Array#[]返回存储在指定索引处的任何对象,因此具有任意返回值:

a = [123, :foo, "bar"]

a[0] #=> 123    (Integer)
a[1] #=> :foo   (Symbol)
a[2] #=> "bar"  (String)
a[3] #=> nil    (NilClass)

相关问题