请看下面的示例,我认为最好使用第二种方法,但第一种方法也可以。 哪种方法更好,使用另一种方法会有什么后果?
class Test
def start
p "started"
end
test = Test.new
test.start
end
class Test2
def start
p "started"
end
end
test2 = Test2.new
test2.start
请看下面的示例,我认为最好使用第二种方法,但第一种方法也可以。 哪种方法更好,使用另一种方法会有什么后果?
class Test
def start
p "started"
end
test = Test.new
test.start
end
class Test2
def start
p "started"
end
end
test2 = Test2.new
test2.start
我认为第二种方式更有意义。第一种方式不会导致错误,但对象实例化是完全过时和无意义的。类范围内不可见外部变量:
var = "string"
class A
var = A.new
end
puts var #=> string
没有闭包,外部的 var 与类内不同。这意味着创建对象后,您的对象将“丢失”,无法再访问,并最终受到GC的影响。
当您说第一个示例“有效”时,在此上下文中,“有效”意味着可以在类范围内创建新对象后立即调用该对象上的方法。但是,无法将该对象保留为以后使用的引用(而不将其分配给类(实例)变量)。
如果您不需要以后的引用,并且确实想执行这样的“一次性”操作,则更符合语言习惯的做法是使用可以在未实例化对象的情况下调用的类方法或在初始化中执行必要的操作,如果是每个实例化都必须完成的操作。
当类创建一个自身对象时,并不是一个好的想法。该对象只能在其自身范围内使用,而不能在其父级范围中使用(当然您仍可通过ObjectSpace::each_object
访问它)。
class Test
def start
p "started"
end
new
end.start
new
吗?因为类后面的最后一个 .start
应该还是能正常工作的。 - embossnew
之后定义了方法start
,那么在定义start
之前就会创建一个新对象并调用它的start
方法。 - lukadnew
的问题。谢谢! - emboss这是关于Ruby最佳实践的最佳文档:https://github.com/bbatsov/ruby-style-guide
test2 = Test2.new
иҖҢдёҚжҳҜtest2 = Test.new
гҖӮ - lukad