gpt4 book ai didi

ruby - 我应该将该方法添加为 protected 方法吗?为什么?

转载 作者:太空宇宙 更新时间:2023-11-03 16:05:42 27 4
gpt4 key购买 nike

我想在 UserItem 子类中覆盖 Item 的 find_items 方法。我应该将该方法添加为 protected 还是 private

我现在 protected 方法可以在子类中使用,而私有(private)方法只能在它们所属的类中使用。

class Item
def item_ids
@ids ||= REDIS.zrevrange(key, 0, 100).map(&:to_i)
end

def items
find_items
item_ids.collect {|id| records.detect {|x| x.id == id}}.compact.map(&:content)
end

protected
def items_scope
Item
end

def find_items
items_scope.find(item_ids)
end
end

class UserItem < Item
def initialize(user)
@user = user
end
# should I add it here?
protected
# or here?
def items_scope
Item.where(user_id: @user.id).not_anonymous
end
end

方法覆盖:

def find_items
items_scope.where(id: item_ids)
end

最佳答案

Ruby 中的语义与您可能习惯的不同。其实,私有(private)意味着您不能为该方法明确指定接收者,但您可以只要您不指定接收者,也可以从派生类中使用它。因此

class A
def bar; 42; end
private :bar
end

class B < A
def foo; bar; end
end

和 B.new.foo 工作得很好。因此,Ruby 中的 private 非常接近于 protected在其他 OO 语言中。我什至不记得 Ruby 中的 protected 是什么;这个很在 Ruby 中很少使用。

在您的示例中,我不会将 private 用于 find_items。我会将其公开或将其变成 mixin(因为它不使用实例变量)

关于ruby - 我应该将该方法添加为 protected 方法吗?为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14321503/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com