ruby简单的基础 3

Ruby中一切都是对象,包括一个常数.
比如可以用.class属性来查看一个对象的类型,你可以看下1.class,会发现常数1的类型是Fixnum,1不过是Fixnum的一个实例。

Ruby中的类以class开始 以end结束,类名首字母的约定是大写。
Ruby中的方法以def开始 以end结束,方法名首字母的约定是小写。
Ruby中的局部变量名首字母的约定是小写。
Ruby中的构造函数名称为initialize。
Ruby中的成员变量(实例变量)前导@符,在initialize里进行声明与初始化。
Ruby中的属性用attr, attr_reader, attr_writer, attr_accessor。
Ruby中的全局变量前导$符。
Ruby中的常数(常量)用大写字母开头,约定是全部大写。

initalize方法

当Ruby创建一个新对象时,它总是会寻找一个名为 initialize 的方法并执行它.因此,我们可以简单通过一个initialize方法向实变量中加入缺省值。

class Person

  def initialize()
    puts "hello!"
  end

 # def initialize  #()省略一样
 # 		puts "hello!"
 # end

 #参数默认值
 # def initialize (param = "1900lab") # 参数带有默认值
 # 		puts "hello! " + param
 # end

 #可变长参数
  def youInput(*names)
      puts "input #{names.join(",")}!"
  end
end

p = Person.new()
和 p = Person.new 一样,没有参数()可以省略。

属性

目的是快速生成读写方法

attr :attr1, key
attr_reader :attr1, :attr2
attr_writer :attr1, :attr2
attr_accessor :attr1, :attr2

attr 一般后跟一个符号参数, 第二个参数是一个 bool 参数,用于指示是否为符号参数产生写方法。它的默认值是 false,只产生读方法,不产生写方法。
attr_reader 一般后跟一个符号参数,定义一个或多个只读的属性,用于指示为符号参数产生读方法。
attr_writer 一般后跟一个符号参数,定义一个或多个只写的属性,用于指示为符号参数产生写方法。
attr_accessor 一般后跟一个符号参数,定义一个或多个可读写的属性,用于指示为符号参数产生读写方法。

为什么要用 符号
我们可能会有疑问,为什么 attr 后面要用符号呢(冒号:+ 变量)?

其实我们不用符号也可以的

class Person

  attr "name",true

end

p = Person.new()
p.name = "xiao ming"
puts p.name

我们需要知道

符号是不可改变的字符串,也不可被GC的 
在大多数情况下,接受符号作为参数的方法也能接受字符串,反过来不成立; 
每个符号在对象空间中只出现一次,用符号要比用字符串省内存

为什么Ruby runtime可以保证每一个symbol唯一?

这是因为Ruby把symbol存放在运行时维护的一个符号表里了,而这个符号表实际上是一个atom数据结构,其中存储着当前所有的程序级的name,确保不出现内容相同的多个对象。几乎每一个语言和系统都会有这样一个符号表,只不过象C/C++那样的语言,这个符号表只是在编译时存在,运行时就没了。而Python、Ruby则在运行时也保留这张表备用。

为什么用符号

只所以用符号不用字符串,我想主要是内存和效率这两个方面吧。
Ruby中两个内容相同的字符串文本量实际上是两个不同的对象。
    a = "hello"
    b = "hello"
虽然俩字符串内容都一样,但是你比一下a和b,就知道a.object_id != b.object_id,它们指向的不是同一个对象。
如果用字符串的话,p.name = "xiaoming" 和 p.name = "小红" 就可能占用2倍的内存。
效率方面可能就是为了避免多次动态生成字符串吧。

ruby简单的基础 3

时间: 2024-10-02 05:36:36

ruby简单的基础 3的相关文章

ruby简单的基础

好久没写记录东西了,最近决定记录写ruby方面的东西,大家一起学习. ruby 基础语法 1.注释 单行注释 ##开始到行末是单行注释 多行注释 =begin =end多行注释以=begin开始 以=end结束,=begin和=end前不能有其他字符,包括空格.一般=begin 和 =end独占一行,这样看起来比较清晰. Ruby中用;来表示一个语句结束.如果一行有多个语句,每个语句可以用:隔开,最后一个:可以省略. 换行表示一行结束,如果语句太长的话,我们可以用\连接下一行,表示这行还没有结束

ruby简单的基础 2

1.代码块 代码块是用大括号或者do...end括起来的一系列代码.{ #this is a block} do #this is a blockend [1,2,3,4,5].each {|i| puts i} [1,2,3,4,5].each do |i|puts iend这2中写法效果是一样的,用{}可能更像C的风格 2.作用域 Ruby程序只会在3个地方关闭前一个作用域,同时打开一个新的作用域: 类定义, class - end模块定义, module - end方法定义, def -

ruby简单的基础 5

方法和代码块 在Ruby中,{}或do...end之间的代码是一个代码块.代码块只能出现在一个方法的后边,它紧接在方法最后一个参数的同一行上,一般由yield关键字调用代码块中的代码. 方法是一个有名的代码块,是与一个或者多个对象相关联的参数化代码.调用方法时必须要给出方法名.所在对象(接受者),以及零个或者多个参数值,方法中最后一个表达式的值将作为方法调用的返回值. 代码块不是ruby可操作的对象,一般我们用一个Proc对象代表一个代码块.有两种方式的Proc对象,一种是proc,一种是lam

ruby简单的基础 6

模块 模块同类一样,也有 class method 和 instance method.module 没有new不能生成实例对象其中 class method 在模块中称为模块方法,是可以直接调用的. module Foo def self.hello puts 'hello world!' end def Foo.dear #module全局作用域内的self还是没有变,就是Module: puts 'dear..' end NUM = 100 end Foo.hello   #=>  'he

ruby简单的基础 4

后缀标点符号 =结尾假设方法名字以=结尾的,那么在调用此方法时能够省略这个=. ?结尾作为一个实用惯例,那些返回布尔值的方法通常都有一个以问号结尾的名字. .结尾这个命名惯例通常时对两种方法区分:以感叹号结尾的方法一般会改变调用它们的对象,不以感叹号结尾的方法则不会改动调用它们的对象.而是改动原始对象的一个拷贝. 圆括号在ruby中,圆括号一般是可选的而且一般都被省略掉,尤其是在调用那些不带參数的方法时更是如此. 字符串内插 由双引號""引起来的字符串中能够包括不论什么ruby表达式.

Linux简单的基础命令

CentOS6.5的一些简单的基础命令和大家分享一下 cd  进入某个路径 cd .. 返回上一级 cd - 返回上一次的路径 cd~ 进入家目录 touch  创建新文件 mkdir  创建新目录 mkdir -p  递归创建新目录 rm -f  免交互删除 rm -rf  免交互递归删除 cp  从某个路径复制到某个路径 cp -r  递归式从某个路径复制到某个路径 mv  从某个路径移动到某个路径  ls  列表文件内的目录及文件 ls -a  列表文件内的目录及文件包括隐藏文件 ls -

[您有新的未分配科技点]博弈论进阶:似乎不那么恐惧了…… (SJ定理,简单的基础模型)

这次,我们来继续学习博弈论的知识.今天我们会学习更多的基础模型,以及SJ定理的应用. 首先,我们来看博弈论在DAG上的应用.首先来看一个小例子:在一个有向无环图中,有一个棋子从某一个点开始一直向它的出点移动,双方轮流操作,无法操作者输,问是否先手必胜. 考虑一下我们之前的Nim游戏,如果我们把后继状态看成后继点的话,不难发现Nim游戏的互相转移也是一个DAG.因此,DAG上出度为0的点的sg值为0,再用上一篇博客提到的mex操作来求每个点的值就可以了(注意,这并不是一个"大"子图,不能

jQuery很简单很基础的

一.了解jQuery 1.jQuery是一个JavaScript库:极大地简化了JavaScript编程:易学. 2.jQuery库可以通过一行简单标记添加到网页中 特征:HTML元素选取.操作:CSS操作:HTML事件函数:JavaScript特效和动画:HTML DOM遍历和修改:AJAX:Utility. 3.添加jQuery库(位于一个JavaScript文件中,其中包含了所有的jQuery函数),<script>标签应该位于页面的<head>部分 1 2 3 <he

多线程一些简单的基础

一.进程:进程是受操作系统管理的基本运行单位: 二.线程:在进程中独立运行的子任务: 三.多线程的好处: 可以在同一时间内运行更多不同种类的任务: 单任务的特点是排队执行,也就是同步,CPU利用率很低: 多任务的特点也就是多线程,同时执行,异步操作,CPU快速切换,提高利用率: 四.Java里面的多线程基础 1.实现多线程的两种方式,继承Thread类,实现Runnable接口,一般最好实现Runnable接口,因为Java是单继承机制,如果继承Thread类,就不能继承其他类,会给程序带来很大