我正在阅读一本Ruby书籍,它看起来像一个方法或类定义是一个对象。 所以,我可以这样做:类或方法定义也是Ruby中的一个对象吗?
my_class = class Abc; end
my_class评估为NilClass。
你可以用这个变量做的事情不多。但是,将类或方法定义为nil
对象又有什么意义呢?
我正在阅读一本Ruby书籍,它看起来像一个方法或类定义是一个对象。 所以,我可以这样做:类或方法定义也是Ruby中的一个对象吗?
my_class = class Abc; end
my_class评估为NilClass。
你可以用这个变量做的事情不多。但是,将类或方法定义为nil
对象又有什么意义呢?
通常变量不会被分配给类或方法定义。
然而,这是可能的匿名类:
MyClass = Class.new do
# class body goes here
end
方法定义返回方法名的符号,它可以被用来调用该方法以各种方式
foo_symbol = def foo; "ok"; end
puts foo_symbol == :foo # => true
# call the method using send
send(foo_symbol) # => "ok"
# convert to a proc and call
method(foo_symbol).call # => "ok"
当然该方法仍可通过foo
调用。如果目标是创建一个刚分配给变量的匿名方法,那么最好先将其设置为一个proc。
foo_proc = Proc.new { "ok" }
# it can be assigned as an instance method on the class
MyClass.send(:define_method, :foo, &foo_proc)
MyClass.new.foo # => "ok"
虽然说实话,这种解构的是不是从一个可理解的角度一定有利,除非有一些元编程回事它可能是简单的使用方法,定期/班。
我倾向于认为作者意味着您可以将类和方法分配给变量(而不是定义它们的文字语句)。
当您定义一个类时,您定义它的代码块将返回最后一条评估语句。例如,您的示例返回nil,因为没有任何评估。但看看会发生什么,当我们的类定义添加代码:
irb(main):026:0> class Abc
irb(main):027:1> SOME_CONSTANT = 'boiled_frogs'
irb(main):028:1> end
=> "boiled_frogs"
如果你想将类分配给一个变量,你会定义类第一:
irb(main):040:0> class Abc ; end
=> nil
irb(main):041:0> the_class = Abc
=> Abc
方法的工作有点不同的 - 方法将返回(当然,代表法名称的符号)当您最初定义它:
irb(main):037:0> def my_method
irb(main):038:1> return 'boiled_frogs'
irb(main):039:1> end
=> :my_method
没有,类定义和方法定义是语法,它们不是对象。他们做,但是评估一个对象:
方法定义计算为Symbol
表示该方法的名称:
def foo; end
#=> :foo
这允许你做这样的事情,例如:
private def foo; end
类定义评估为在定义内部求值的最后一个表达式的值:
class Foo; 'Hello' end
#=> 'Hello'