classMaindefsay_helloputs"Hello"endprivatedefsay_hiputs"hi"endendclassSubMain输出:hiTesting 最佳答案 区别在于在ruby中你可以隐式调用子类中的私有(private)方法而不是显式调用。Protected可以双向调用。至于为什么?我猜你得问问Matz。例子:classTestMainprotecteddefsay_holaputs"hola"enddefsay_ni_haoputs"nihao"endprivatedefsay_hiputs"hi
我对Ruby还是个新手,基本上只是在读完Cooper的书后编写我的第一个微程序。我被指出了避免猴子修补的方向,但问题是我不知道实现相同行为的替代方案是什么。基本上,我想添加一个可供每个字符串对象访问的新方法。明显的猴子修补方法是:classStringdefdo_magic...magic...endend我记得有一种使用String.send的方法。但我不记得它是如何完成的,也不记得我是在哪里读到它的。谁能指出任何替代方案,让我仍然可以使该方法可用于String类和子对象? 最佳答案 任何其他的方式都会使猴子修补的语法更加笨拙。有
测量工作代码(在一个名为Surveyor的模块中,不少),试图理解它。我遇到了这个包含模块中的类的部分。这与包含模块相同吗?如果不是,这样做的好处是什么?谢谢。(奖励积分:为什么我们要将self附加到类中,这不是已经暗示了吗?)moduleSurveyorclassCommonRAND_CHARS=[('a'..'z'),('A'..'Z'),(0..9)].map{|r|r.to_a}.flatten.joinOPERATORS=%w(==!===~)class]*>)|\n|\t/su,'')#Removehtmltagscol_text.downcase!#Removecapit
我在玩ruby元编程,我有一个问题。我有一个类:classKlassclassyeahKlass.instance_eval"@x"#=>nil为什么?在变量a中我有一个单例类,对吗?并且Klass.instance_eval在单例类的上下文中执行:Klass.instance_eval"defyeah;puts10;end"Klass.yeah#=>10此外,解释器中的Klass指向类的上下文,是吗?a指向单例类的上下文?哪个表示a.class_eval和a.instance_eval?我这样做:a.instance_eval"defpops;puts0;end"a.class_
我的Rails应用程序中有一个私有(private)方法来连接到AmazonS3,执行传递的代码块,然后关闭与S3的连接。看起来是这样;defS3AWS::S3::Base.establish_connection!(:access_key_id=>'Nottelling',:secret_access_key=>'Reallynottelling')data=yieldAWS::S3::Base.disconnectdataend它是这样调用的(作为例子);send_data(S3{AWS::S3::S3Object.value("#{@upload_file.name}",'buc
给定一个类层次结构如下:classAdefinitialize(param)ifparam==1then#initializeandreturninstanceofBelse#initializeandreturninstanceofCendendendclassB是否可以实际初始化并返回B的实例?或C初始化时A?IE。my_obj=A.new(param)会导致my_obj作为类B的一个实例或C取决于param的值,在A.initialize(param)中检查.在我的用例中,它只在运行时知道要使用哪个子类(B或C),而父类(A)基本上从未真正使用过。我认为移动决定是否B的逻辑可能是
所以,我很好奇Ruby为什么是一种完全面向对象的语言。我偶然发现了一个我不太清楚的问题。如果我定义一个函数如下deffoo(text)printtextend而且我在类之外定义函数,这个函数怎么是对象?我意识到我可以打电话foo.class然后我得到了NilClass。这是否意味着foo是NilClass的一个实例?如果是,当我打电话时它到底意味着什么foo"helloworld"如果foo是一个对象,那么当我进行上述语句时,我调用的是什么方法。另外,如果它是一个对象,是否意味着我可以修改它并向它添加另一个方法(比如bar),我可以在其中进行以下声明:foo.bar(somevaria
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visitthehelpcenter指导。关闭11年前。最近对Smalltalk的介绍让我明白了“纯”面向对象风格的应用和好处。我以前在Ruby中看到过这样做的好处,尽管存在非面向对象的if、unless等结构似乎并没有一路承载东西通过。这里的pure是指“一切皆对象”(包括通过block或类似东西实现的功能)和没有过程式流控制,而是在bool值和集合上使用流控制方法。然而,即使在像Smalltalk这样
假设我有一个这样定义的Erlangactor:counter(Num)->receive{From,increment}->From!{self(),new_value,Num+1}counter(Num+1);end.同样,我有一个这样定义的Ruby类:classCounterdefinitialize(num)@num=numenddefincrement@num+=1endendErlang代码以函数式风格编写,使用尾递归来维护状态。然而,这种差异的有意义的影响是什么?在我天真的眼中,这两个事物的接口(interface)看起来非常相似:您发送一条消息,状态得到更新,然后您返回新
最近我一直在阅读“Ruby中的实用面向对象设计”,我注意到最佳实践之一是使用访问器方法而不是直接获取@instance_variable。例如:classFooattr_accessor:bardefinitialize(my_argument)@bar=my_argumentend#bad#deflorem_ipsum#@bar*999#end#gooddeflorem_ipsumbar*999endend让事情保持干燥是有意义的,并且,以防万一我需要在实际获取它的值之前以某种方式处理@bar。但是,我注意到initialize方法直接设置了@bar实例变量的值:classFooat