为什么Ruby中的方法里面没有类?
我可以在函数体中创建Ruby类吗? 我似乎得到了错误,它告诉我它不被允许,但我认为它应该是因为这里的类太对象了。
A级 def方法 B级 结束 结束 结束
这失败了,在方法体内部有错误的类定义。 如果我们不能,为什么我们不能在方法内创建类?
class A def method self.class.const_set :B, Class.new { def foo 'bar' end } end end A.new.method A::B.new.foo # => 'bar'
但是,为什么要在方法中分配常量? 这没有意义:常量是常量 ,你只能分配给它们一次,这意味着你只能运行一次方法。 然后,为什么你要编写一个方法,如果它只会被运行一次,无论如何?
您可以创建类,但不能从方法内部分配常量。
这个例子有效:
class A def a b = Class.new def b.xxx "XXX" end b end end a = A.new.a pa # # p a.xxx # "XXX"
您可以从方法中创建类并将它们分配给常量,如下所示
class A def create_class class_name new_class = Class.new new_class.send :define_method, :speak do "Hi, There" end Object.const_set class_name, new_class end end A.new.create_class "Harry" h = Harry.new puts h.speak # responds => "Hi, There"
因为与其他许多语言不同,String中的类名只是ruby中的常量。
问题是关于创建类,但在评论中你谈到了创建匿名对象 。 不一样的事情。
如果您需要匿名对象,则可以始终执行Object.new
。 如果你需要简单的类似struct的容器,你应该看一下Struct
类。 有了它,你可以做以下事情:
def foo anon_obj = Struct.new(:prop1, :prop2).new anon_obj.prop1 = 123 anon_obj.prop2 = 'bar' return anon_obj end
顺便说一句,Ruby 是一种强类型语言。 但它也是一个动态类型,你不能指望它表现得像静态类型。