请参阅下面的示例,我想最好使用第二种方法,但第一种方法也可以。 哪种方法最好,使用另一种方法的后果是什么?
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
答案 0 :(得分:4)
我想说第二种变体更有意义。第一个不会导致错误,但是对象实例化完全过时且毫无意义。外部变量在类的范围内不可见:
var = "string"
class A
var = A.new
end
puts var #=> string
没有闭包,外var
与班级内的initialize
不同。这意味着您的对象在创建后“迷失”,将无法再访问,并最终受GC影响。
当您说第一个示例“有效”时,在此上下文中工作意味着 可以在类范围内创建该对象后立即调用新创建的对象上的方法。但是不可能将该对象作为参考以供以后使用(不将其分配给类(实例)变量)。
如果您不需要参考以供以后使用,并且您真的想要进行这样的“一次性”操作,那么使用可以在不实例化对象的情况下调用的类方法或执行必要的操作将更加惯用在{{1}}中,如果它必须在每个实例化上完成。
答案 1 :(得分:3)
你可以通过多种方式做到这一点,这取决于你。这是一个有趣的...
class Test
def start
p "started"
end
new
end.start
更严重的是,您的第一个示例将所有内容封装在一个类中。对于剧本来说没关系;它将所有内容放在您自己的命名空间中,并且主要避免了神秘的主对象上下文。如果需要,可以定义嵌套类。
然而,第二种方法更为传统。
答案 2 :(得分:3)
定义一个在加载时创建自身对象的类不是一个好主意。
该对象只能用于自己,而不能用于其父级的范围(当然您仍然可以通过ObjectSpace::each_object
访问它。)
答案 3 :(得分:2)
SOLID
。to_s
方法。attr
。请改用attr_reader
和attr_accessor
。Struct.new
,它为您定义了简单的访问器,构造函数和比较运算符。Struct.new
初始化的实例。扩展它会引入一个多余的类级别,如果多次需要该文件,也可能会引入奇怪的错误。(@@)
变量。public
,protected
和private
方法,与它们适用的方法定义一样多。在可见性修饰符上方留一个空行,在下面留下一个空行,以强调它适用于它下面的所有方法。这是红宝石最佳做法的最佳文档:https://github.com/bbatsov/ruby-style-guide