Class Methods & Variables
When calling an instance method like withdraw_securely
, the syntax generally looks something like this:
object.method_being_called(arguments)
One would therefore think it’s safe to assume that an instance method is always preceded by a .
,
which is in turn preceded by the object that is calling the method.
Why, then, did this code work in the previous example?
# from inside the Customer class def withdraw_securely(amount, password)
if password == @password
remove_funds(amount)
end
end
Isn’t remove_funds
also an instance method? Why is it suddenly exempt from following the sameobject.
method_being_called
syntax just because it’s inside a method?
This can be compared to spoken language. If you were asking Diego to tell us his name, you might say to him “Diego, tell us your name.”
But if you were asking me to tell you my name, you’d likely say “Tell me your name”.
Yes, you could have said “You, tell me your name,” but that would have been redundant. “You” isimplicit in “Tell me your name”.
Similarly, when you call an instance method from within a class, there is an implicit object being called: itself.
# from inside the Customer class def withdraw_securely(amount, password)
if password == @password
self.remove_funds(amount)
end
end
An object can refer to itself using the self
keyword. Think of it as an object’s way of saying “me” or “I”.
When you call remove_funds
from within the Customer
class, you’re saying “remove these funds from myself”.
And since Ruby is all about removing any unnecessary syntax, self
in this context is implicit, and can be left out entirely.
An instance variable like @password
is scoped to a particular instance of a class.
But what if you wanted a variable that was shared across all instances of a class? Almost like… a class variable.
@@check_out_this_cool_class_variable = "boom."
Boom is right.
A class variable’s syntax is twice as cool as an instance variable, because it has two @
’s instead of just one.
Let’s see how one might use a class variable.
class Employee
@@bank = "Udacity International Bank" def bank
@@bank
end
end
Unfortunately, class variables can’t be accessed using attr_accessor
, so you’ll need to create your own bank
getter method in this case.
Initialize two instances of an employee to see this working.
elana = Employee.new
# => #<Employee:0x007fcdb48c19d0>
corey = Employee.new
# => #<Employee:0x00nfbdm132ejd9>
elana.bank
# => "Udacity International Bank"
corey.bank
# => "Udacity International Bank"
Great, now this @@bank
class variable is shared across all instances of an Employee
class.
But… Why?
Class variables are used considerably less frequently than instance variables.
Unlike the public
keyword, though, there are some practical use cases for class variables. Here are two of those use cases.
class Customer
attr_reader :id @@id = 1
@@customers = [] def initialize
@id = @@id
@@id += 1
@@customers << self
end
end
If you break this apart, you’ll see two class variables, @@id
and @@customers
.
Every time a new customer is instantiated, an instance variable of @id
is set to the value of theclass variable @@id
.
Immediately afterwards, the @@id
class variable is incremented by one.
larry = Customer.new
# => #<Customer:0x007faaba8a6aa8 @id=1>
christine = Customer.new
# => #<Customer:0x007faaba8a6aa8 @id=2>
larry.id
# => 1
christine.id
# => 2
This way, the Customer
class can keep track of the total number of customer objects that have been created.
By assigning the class variable to the instance variable @id
, you are capturing the current ID number from when that particular customer object was created.
Similarly, @@customers
in this case is an Array that holds all the customer objects that have ever been created.
After a new customer is initialized, self
, the particular instance currently being used, is pushed into this @@customers
Array.
Unfortunately, we’re left without an appropriate interface for accessing @@customers
.
It wouldn’t make sense to create a customers
instance method, since an Array of customers isn’t really a property of a particular customer.
If only there were something else...
Class variables can be especially powerful when coupled with class methods.
Class methods differ from instance methods in that they are called directly on the class name, like so:
Customer.this_is_a_class_method
These are used when you need to call a method that doesn’t apply to a specific instance of a class.
Say you need a method to retrieve all the customers you’ve created so far. This method could be called all
.
Defining a class method works just like defining an instance method, except it must be preceded by self.
class Customer
attr_reader :id @@id = 1
@@customers = [] # ... def initialize
@id = @@id
@@id += 1
@@customers << self
end def self.all
@@customers
end
end
Now, if at any point you’d like to retrieve an Array of all existing customers, you can simply call the class method.
Customer.all
# => [#<Customer:0x007faaba84c148 @id=1>, #<Customer:0x007faaba82fe30 @id=2>]
Class Methods & Variables的更多相关文章
- iOS编码规范
The official raywenderlich.com Objective-C style guide. This style guide outlines the coding con ...
- 微软版的SqlHelper.cs类
一,微软SQLHelper.cs类 中文版: using System; using System.Data; using System.Xml; using System.Data.SqlClien ...
- OracleHelper类
using System; using System.Collections; using System.Collections.Generic; using System.Data; using S ...
- SqlHelper类
using System; using System.Collections; using System.Collections.Generic; using System.Data; using S ...
- 【2016-11-2】【坚持学习】【Day17】【微软 推出的SQLHelper】
从网络上找到 微软原版本的SQLHelper,很多行代码.认真看了,学习了. 代码: using System; using System.Data; using System.Xml; usin ...
- <java基础学习>RE 基础语法(2)
Java Modifiers(java修饰符): Like other languages, it is possible to modify classes, methods, etc., by u ...
- SQLHelper
今天学习了.net后,经过老师的一番讲解,似乎对它越来越渴望了,希望自己在接下来的学习当中,能很好的驾驭.net,加油吧, 下面我分享一个操作SQL数据库的代码大全,谢谢观赏.嘿嘿,还是比较长的哦, ...
- Java Annotation 总结
Annotation 被称为注解,在Java开发中是相当常见的,通过注解,我们可以简化代码提高开发效率.例如Override Annotation,这个应该算是在开发过程中使用最多的注解了.下面这个例 ...
- ASP.NET SignalR 与 LayIM2.0 配合轻松实现Web聊天室(一) 之 基层数据搭建,让数据活起来(数据获取)
大家好,本篇是接上一篇 ASP.NET SignalR 与 LayIM2.0 配合轻松实现Web聊天室(零) 前言 ASP.NET SignalR WebIM系列第二篇.本篇会带领大家将 LayIM ...
随机推荐
- python3 入门 (四) 类与继承
Python 类 Python中的类提供了面向对象编程的所有基本功能:类的继承机制允许多个基类,派生类可以覆盖基类中的任何方法,方法中可以调用基类中的同名方法. 对象可以包含任意数量和类型的数据. p ...
- [wikioi 1418]铃仙•优昙华院稻叶(东方幻想乡系列模拟赛)(树上递推)
题目:http://www.wikioi.com/problem/1418/ 分析: 一看就肯定是树上的递推 设f[i][j][k]表示第i秒在k点(从j点走过来的)的概率 则f[i][j][k]=f ...
- Bootstrap3.0学习第二十二轮(JavaScript插件——弹出框)
详情请查看http://aehyok.com/Blog/Detail/28.html 个人网站地址:aehyok.com QQ 技术群号:206058845,验证码为:aehyok 本文文章链接:ht ...
- Javascript基础系列之(八)Javascript的调试与优化
Javascript的错误主要是语法错误和运行时的错误,前者在代码解析时就会出错,影响程序的运行.后者称为异常,影响它所运行的线程.下面就Javascript常见错误进行分析 1.常见的错误和异常 i ...
- 八幅漫画理解使用JSON Web Token设计单点登录系统
用jwt这种token的验证方式,是不是必须用https协议保证token不被其他人拦截? 是的.因为其实只是Base64编码而已,所以很容易就被解码了.如果你的JWT被嗅探到,那么别人就可以相应地解 ...
- 团队作业 -- beta版本
下一阶段需要改进完善的功能 1界面布局 2方块颜色调整 下一阶段新增的功能 1分数排行榜 2撤销上一步操作 需要改进的团队分工 无. 按要求加上一起进行编码任务 需要改进的工具流程 使用github进 ...
- 利用less监视模式实时预览样式刷新浏览器
[前言]此处介绍的方法只是我个人的用法,相信大家有更好更简洁的方式. 上次写到利用LiveReload解放F5.而且LiveReload可以编辑sass/less/stylus.但是可惜发现LiveR ...
- Sping MVC-创建HelloWeb项目(一)
下面的例子显示怎样使用Spring MVC框架写一个简单的基于Web的应用程序,使用Eclipse IDE作为开发工具,按照下面的步骤使用Spring Web框架来开发一个动态的Web应用 步骤 描述 ...
- org.eclipse.m2e.MAVEN2_CLASSPATH_CONTAINER
org.eclipse.m2e.MAVEN2_CLASSPATH_CONTAINER Eclipse中出现无法找到Maven包 症状:出现org.maven.ide.eclipse.MAVEN2_CL ...
- Linux中的TUN/TAP设备
今天才发现这家伙...怎么讲...深以为耻.晚上的任务是加深对它的了解,就这么定了. 1. General questions.1.1 What is the TUN ? The TUN is Vi ...