Ruby on rails 如何在Ruby中定义私有方法?
刚开始学习Ruby。我对Ruby的Ruby on rails 如何在Ruby中定义私有方法?,ruby-on-rails,ruby,Ruby On Rails,Ruby,刚开始学习Ruby。我对Ruby的private关键字感到困惑 假设我有这样的代码 private def问候语 随机应答:问候语 结束 再见 随机回应:再见 结束 private是否仅适用于问候语或同时适用于问候语和告别?它适用于private下的所有内容,即问候语和告别 要将其中一个设置为私有,您可以将问候语单独设置为私有,如下所示: def greeting random_response :greeting end private :greeting def farewell
private
关键字感到困惑
假设我有这样的代码
private
def问候语
随机应答:问候语
结束
再见
随机回应:再见
结束
private
是否仅适用于问候语
或同时适用于问候语
和告别
?它适用于private
下的所有内容,即问候语
和告别
要将其中一个设置为私有,您可以将问候语
单独设置为私有,如下所示:
def greeting
random_response :greeting
end
private :greeting
def farewell
radnom_response :farewell
end
文档可以在上找到,将私有/受保护的方法放在文件的底部是相当标准的。
private
之后的所有内容都将成为私有方法
class MyClass
def a_public_method
end
private
def a_private_method
end
def another_private_method
end
protected
def a_protected_method
end
public
def another_public_method
end
end
如本例所示,如果确实需要,可以使用public
关键字返回到声明公共方法
通过将私有/公共方法缩进另一个级别,可以更容易地看到作用域的变化,直观地看到它们被分组在private
部分等下
您还可以选择仅声明一次性私有方法,如下所示:
class MyClass
def a_public_method
end
def a_private_method
end
def another_private_method
end
private :a_private_method, :another_private_method
end
使用
private
module方法仅将单个方法声明为private,但坦率地说,除非您总是在每次方法声明之后立即执行,否则找到私有方法可能会有点混乱。我更喜欢将它们放在底部:)在Ruby 2.1中,方法定义返回它们的名称,因此您可以对传递函数定义的类调用private
。您还可以将方法名称传递给private
。在private
之后定义的任何不带任何参数的内容都将是私有方法
这样,您就可以使用三种不同的方法来声明私有方法:
class MyClass
def public_method
end
private def private_method
end
def other_private_method
end
private :other_private_method
private
def third_private_method
end
end
在Ruby 2.1中,也可以像这样将单个方法标记为私有(空格是可选的):
class-MyClass
私人的\
def-private_方法
“私人”
结束
私人的\
def private_method2
“私人2”
结束
def-public_方法
p-u法
“公众”
结束
结束
t=MyClass.new
PUTTS t.public#U方法将起作用
puts t.private_method#错误:private method`private_method'
#需要#(命名者)
这两种方法都适用。。。。
class MyClass
private \
def private_method
'private'
end
private\
def private_method2
'private2'
end
def public_method
p private_method
'public'
end
end
t = MyClass.new
puts t.public_method # will work
puts t.private_method # Error: private method `private_method'
# called for #<MyClass:0x2d57228> (NoMethodError)