尝试了解在Ruby中使用self.method_name对Classname.method_name
我试图了解何时使用self.method_name和何时使用Classname.method_name.
在下面的例子中,为什么“before_create”需要引用“User.hash_password”而不是“self.hash_password”或“hash_password”? 由于我们已经在User类中,我认为before_create方法会“知道”,“hash_password”是其自己的类的成员,不需要任何特殊的语法来引用它. require 'digest/sha1' class User < ActiveRecord::Base attr_accessor :password attr_accessible :name,:password validates_presence_of :name,:password validates_uniqueness_of :name def before_create self.hashed_password = User.hash_password(self.password) end def after_create @password = nil end def self.login(name,password) hashed_password = hash_password(password || "") self.find(:first,:conditions => ["name = ? and hashed_password = ?",name,hashed_password]) end def try_to_login User.login(self.name,self.password) end private def self.hash_password(password) Digest::SHA1.hexdigest(password) end end 解决方法def before_create self.hashed_password = User.hash_password(self.password) end 在此示例中,User.hash_password调用User类的hash_password方法,而self.hashed_pa??ssword =调用User的特定实例上的hashed_pa??ssword =方法. 如果将User.hash_password替换为self.hash_password,则Ruby将抱怨NoMethodError,因为在User类中不存在名称为hash_password的实例方法.你可以用self.class.hash_password替换它. 如果用简单的hashed_pa??ssword =替换self.hashed_pa??ssword =,Ruby将创建一个名为hashed_pa??ssword的本地变量,而不是调用实例方法hashed_pa??ssword =.如果要调用属性编写器,则需要显式添加自身. 方法定义中的self(def self.hash_password)使hash_password成为一种类方法,而不是实例方法.在这种情况下,自我指的是类.在实例方法的上下文中,self指的是一个实例. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- 找不到 cocos2dxlib.so
- .net – 如何使用Unity DI加载具有依赖项的程序集,然后注册
- c# – 关于DDD的免费视频(截屏视频,网络直播……)培训
- nosql – 图形数据库之间的区别:Neo4j和AllegroGraph
- Dojo 网页特效基础<12>
- oracle shutdown immediate等待时间很长之思考
- 【Hibernate学习笔记】映射聚合关系和组合关系
- Cocos2dx制作2048(2.数字方块的创建)
- ruby-on-rails – 如何在rails控制台启动时运行一些代码,有
- Bullet(Cocos2dx)之交叉编译Android,集成到cocos2dx3.x