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 publickeyword, 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的更多相关文章

  1. iOS编码规范

      The official raywenderlich.com Objective-C style guide.   This style guide outlines the coding con ...

  2. 微软版的SqlHelper.cs类

    一,微软SQLHelper.cs类 中文版: using System; using System.Data; using System.Xml; using System.Data.SqlClien ...

  3. OracleHelper类

    using System; using System.Collections; using System.Collections.Generic; using System.Data; using S ...

  4. SqlHelper类

    using System; using System.Collections; using System.Collections.Generic; using System.Data; using S ...

  5. 【2016-11-2】【坚持学习】【Day17】【微软 推出的SQLHelper】

    从网络上找到 微软原版本的SQLHelper,很多行代码.认真看了,学习了.  代码:  using System; using System.Data; using System.Xml; usin ...

  6. <java基础学习>RE 基础语法(2)

    Java Modifiers(java修饰符): Like other languages, it is possible to modify classes, methods, etc., by u ...

  7. SQLHelper

    今天学习了.net后,经过老师的一番讲解,似乎对它越来越渴望了,希望自己在接下来的学习当中,能很好的驾驭.net,加油吧, 下面我分享一个操作SQL数据库的代码大全,谢谢观赏.嘿嘿,还是比较长的哦, ...

  8. Java Annotation 总结

    Annotation 被称为注解,在Java开发中是相当常见的,通过注解,我们可以简化代码提高开发效率.例如Override Annotation,这个应该算是在开发过程中使用最多的注解了.下面这个例 ...

  9. ASP.NET SignalR 与 LayIM2.0 配合轻松实现Web聊天室(一) 之 基层数据搭建,让数据活起来(数据获取)

    大家好,本篇是接上一篇 ASP.NET SignalR 与 LayIM2.0 配合轻松实现Web聊天室(零) 前言  ASP.NET SignalR WebIM系列第二篇.本篇会带领大家将 LayIM ...

随机推荐

  1. How to use VS2012 remote debug Windows Azure Cloud Services

    Background: Windows Azure Cloud Services 可以在本地调试,使用Visual Studio 2012 + 模拟器 Emulator.但是模拟器的工作状态和环境和真 ...

  2. 一份完整的nginx配置

    #user nobody;worker_processes 24;worker_rlimit_nofile 262144;worker_cpu_affinity 0000000000000000000 ...

  3. multiparty

    nodejs使用multiparty模块实现文件上传(另附express.bodyParser()的说明) http://blog.csdn.net/o6875461/article/details/ ...

  4. 05.C#泛型类型(三章3.1-3.2)

    接下来说下C#中的泛型,熟练地使用泛型能提高代码的重用性,使用我们代码瞬间就高大上了,当然只有一点点,真的只有一点点,因为后面要学习和掌握的知识还有很多.先来看下一个使用Dictionary<T ...

  5. jQuery理解之(二)功能函数

    在javascript编程中,开发者通常需要编写很多小程序来实现一些特定的功能.例如浏览器检测,字符串处理.数组的编辑等.jQuery对这些常用的程序进行了总结,提供了很多实用的函数. 1.检测浏览器 ...

  6. MySQL 5.6 my.cnf 参数说明

    # 以下选项会被MySQL客户端应用读取. # 注意只有MySQL附带的客户端应用程序保证可以读取这段内容. # 如果你想你自己的MySQL应用程序获取这些值. # 需要在MySQL客户端库初始化的时 ...

  7. Java基础-常量

    常量是一种标识符,它的值在运行期间恒定不变.并且常量在程序中只能被引用,而不能被重新赋值. 以下,我们在Math类中就定义了一个全局常量PI被final关键字修饰的变量名最好要大写. public c ...

  8. ETHREAD APC 《寒江独钓》内核学习笔记(4)

    继续学习windows 中和线程有关系的数据结构: ETHREAD.KTHREAD.TEB 1. 相关阅读材料 <windows 内核原理与实现> --- 潘爱民 2. 数据结构分析 我们 ...

  9. 循序渐进Linux 3:Linux下软件安装与管理

    一.源码安装 ./configuremakemake install 二.RPM包 1. 安装软件包 rpm -i [辅助选项] file1.rpm file2.rpm主选项 -i: install, ...

  10. 轻量级应用开发之(06)Autolayout自动布局1

    一 什么是Autolayout Autolayout是一种“自动布局”技术,专门用来布局UI界面的. 自IOS7 (Xcode 5)开始,Autolayout的开发效率得到很大的提高. 苹果官方也推荐 ...