gpt4 book ai didi

ruby - protected 和私有(private)方法

转载 作者:数据小太阳 更新时间:2023-10-29 08:54:21 25 4
gpt4 key购买 nike

我正在通读 Beginning Ruby我被困在关于私有(private)和 protected 方法的部分。我知道这是一个新手问题。我通过 SO 搜索了一下,但无法找到对私有(private)方法和 protected 方法之间区别的清晰且对新手友好的解释。

书上给出了两个例子,第一个是私有(private)方法:

class Person
def initialize(name)
set_name(name)
end

def name
@first_name + ' ' + @last_name
end

private
def set_name(name)
first_name, last_name = name.split(/\s+/)
set_first_name(first_name)
set_last_name(last_name)
end

def set_first_name(name)
@first_name = name
end
def set_last_name(name)
@last_name = name
end
end

在这种情况下,如果我尝试

 p = Person.new("Fred Bloggs") 
p.set_last_name("Smith")

它会告诉我不能使用 set_last_name 方法,因为它是私有(private)的。一切都很好。

但是,在另一个示例中,他们将 age 方法定义为 protected ,而当我这样做时

 fred = Person.new(34)
chris = Person.new(25)
puts chris.age_difference_with(fred)
puts chris.age

报错:

:20: protected method 'age' called for #<Person:0x1e5f28 @age=25> (NoMethodError)

老实说,我看不出私有(private)方法和 protected 方法之间的区别,对我来说听起来是一样的。谁能给我一个明确的解释,这样我就不会再对此感到困惑了?

如有必要,我将提供第二个示例的代码。

最佳答案

protected 方法(或属性)只能由继承具有 protected 方法(或属性)的类的类使用。

a      d
\ \
b e
\
c

如果类a有一个protected方法,这个方法可以被b和c使用,但不能被d和e使用。注意:Ruby 类中继承的 Ascii 艺术图。

class A   
public
def f obj
obj.c
end
def g obj
obj.b
end
def call_b
b
end

private

def b
puts "Hi!_b"
end


protected
def c
puts "Hi!_c"
end
end

a = A.new
b = A.new

a.f(b) # Hi!_c
a.g(b) # inj.rb:7:in `g': private method `b' called for #<A:0xb76df4cc> (NoMethodError)
a.call_b # Hi!_b

在这种情况下,方法 f 可以“看到” protected 方法,因为它属于同一个类(或继承的类),但是私有(private)方法封装(隐藏)了所有情况下的“b”方法,除非这是在他的类内部调用的(通过另一个可访问的方法(在本例中为方法 call_b))。

关于ruby - protected 和私有(private)方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5213478/

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