类或方法定义也是Ruby中的对象吗?

时间:2017-04-04 19:11:55

标签: ruby

我正在阅读一本Ruby书,看起来甚至方法或类定义都是一个对象。 所以,我可以这样做:

my_class = class Abc; end

my_class评估为NilClass。

你对这个变量的处理能力不高。但是,将类或方法定义作为nil对象仍然是什么意思?

3 个答案:

答案 0 :(得分:3)

不,类定义和方法定义是语法,它们不是对象。他们,但评估到对象:

方法定义评估为表示方法名称的Symbol

def foo; end
#=> :foo

这允许你做这样的事情,例如:

private def foo; end

类定义求值为定义中计算的最后一个表达式的值:

class Foo; 'Hello' end
#=> 'Hello'

答案 1 :(得分:0)

通常,变量不会分配给类或方法定义。

但是,可以使用匿名类:

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"

虽然说实话,但从可理解性的角度来看,这种类型的解构并不一定有益,除非有一些元编程,否则使用常规方法/类可能更简单。

答案 2 :(得分:0)

我倾向于认为作者意味着您可以为变量分配类和方法(而不是定义它们的文字语句)。

定义类时,定义它的代码块将返回最后一个计算语句。例如,您的示例返回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