Ruby 关于 ruby 当中的 self

zhaojiahui · 2012年06月28日 · 最后由 bluesky0318 回复于 2019年08月11日 · 8804 次阅读

有谁有关于ruby当中self的好点的资料吗?在看ruby元编程,没怎么看明白他对self的解释。 比如在动态创建方法当中有这样一段:

class Computer
   def initialize(computer_id, data_source)
   .......
   end
   def self.define_component(name)
   ..........
   end
 define_component :mouse
 define_component :cpu
 define_component :keyboard
end

在上面的self.define_component(name)中,方法define_component(name)应该只能通过Computer类来调用,那么这里不用self.define_component(name),改成define_component(name)应该也是可以的吧

共收到 23 条回复

看双飞燕和ruby元编程就可以了,如果是看不明白,可以说具体的疑问,大家帮你解释

上面不是在定义self.define_component(name)方法么?哪有在调用方法define_component(name)?

#2楼 @zgm 额。。我错了。。那定义self.define_component(name) 和直接定义define_component(name)有什么不同?

#2楼 @zgm 不好意思,补全代码了,他为什么要定义成self.define_component(name),而不直接定义成define_component(name)?

@zhaojiahui 加上 self. 相当于java里“类方法”的概念。我试的结果是这样的。

你开玩笑吗 self.define_component是一个类方法。。。

加self是定义成类方法,不加是定义成对象方法,这两者是不一样的吧?

很想听一听,在这个例子里面,定义为类方法和对象方法的有什么不同的作用?

@messiahxu 理论我说不上来,试的结果是这样的,用“类似”来形容可能更恰当

self.define_component和Computer.define_component意义一致,都是类方法 直接定义的是实例方法。

#9楼 @zhangyan 定义成对象(实例)方法之后就只能在实例环境中调用啊。。。。。。但这里是在类环境中调用。说白了就是在class Computer...end之间只能运行类方法。

这个是ruby基础,建议楼主找本书看。

我觉得《Ruby元编程》是介绍 Ruby 运行机制最清晰的书,但这本书是进阶的,楼主连 Ruby 的使用还没熟悉,应该看本入门的书。

类方法是类对象的单件方法 好吧,其实最近在看ruby元编程,真的讲的很通透。

#16楼 @fsword 好快啊,thanks

可能再往后看看,再回过头想想就明白了,现在不理解可以先标记下来,还有楼上的博文,相信将来你会突然明白的。

惊叹于@fsword 的效率! 入门就看这本书的确会陷入复杂的内部原理,建议看如何使用ruby之类的书,先发现它的乐趣,感觉有必要的时候再深入了解。

Computer.def_component
Computer.new.def_component

正好也在读这本书,也来尝试着回答一下。

假设这么一段

class Computer
end

a = Computer.new

按照一般的理解,这段代码就定义了定义一个类 Computer 以及 Computer 的一个实例 a。

Ruby 有意思的地方就在于,Computer 本身其实也是一个类的实例(即一个对象), 那么,Computer 这个对象所属的类又是什么呢? 通过调用

Computer.class # => Class

就可以知道,它本身是类 Class 的一个实例。

那么,让我们回到开头,

class Computer
  def self.define_component(name)
  # ...

这里的 self 意思就很明显了,就是 Computer 这个对象(类 Class 的一个实例)

进一步引申出来的话题还有很多,比如 Class 这个实例本身的 class 又是什么呢,Class / Module / Kernel / Object / BasicObject 的关系是什么?书中早已解答。

另,我没有太多 Ruby 实战经验,不过读这本书的前三章也不算费力,确实是讲透原理的一本好书,推荐。

#15楼 @jiffies 学习了,讲的很好,谢谢

类方法,你可以认为它类似C++,C#或者Java里面的类里面的静态函数,它为所有类实例可见,无需实例化类对象就可以使用了

$ cat a.rb
class A
  def self.x
    p self
  end
end
A.x
A.new.x
$ ruby a.rb
A
a.rb:7:in `<main>': undefined method `x' for #<A:0x00000001a83f58> (NoMethodError)
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册