为什么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 一种强类型语言。 但它也是一个动态类型,你不能指望它表现得像静态类型。