更新: 2017/06/09
更新: 2017/06/20 cattr_accessor定义类变量,相当于@@
更新: 2017/06/23 生成类的实例
更新: 2017/06/24 补充loop的说明
更新: 2017/09/07 增加each_with_index, each.with_index(offset = 0)
更新: 2017/09/28  增加了when的条件句的复合写法
更新: 2017/10/28  加粗了类中常量读取,并补充了不能代入两次
                           增加单行的if简写
更新: 2018/02/28 优化了表格的宽度与列数
更新: 2019/03/30 补充类变量无法从类外部参照, 常数可以
 
Ruby里大致有三种条件分支语法

 句法  
 require "..."  从默认位置引用库
 require_relative "..."  从当前位置引用库
   
 变量  
 本地变量  小字母开头或_开头   a, _a
 全局变量  $开头   $a
 实例变量  @开头
 相当于其他语言的类变量
 在任何一处地方创建整个类里共享
 attr_reader
 attr_writer
 attr_accessor
 类变量

@@开头
 ● 相当于其他语言的类静态变量
 ● 实例方法和静态方法都可以参照

● 无法从类外部参照

 常量

大字母开头, 如A, TEMP 
 ● 不要再代入(用两次=)

   
 access修饰  
 public  
 private  
 protected  
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
 方法定义 def hello(name)
...
 end

注意: 指定默认值方法如下
     
    def hello(name =
"default")
return 回值,后面没东西返回nil
     
    默认返回最后一个值
不带参数可以省略括号或者用空括号
不固定长度的参数def test(*arg)

 可带标签  def test(a: 0, b: 0, c: 0)
  ...
 end

def convert(origin, to: 0)
origin = to
 end

 静态方法  class << class-name
...(defination)
 end
上面这个也可以用来加函数到实例里去
或者
 def class-name.method(...)
...
 end
如在类中则可
 def self.method(...)
 方法改名与删除  alias
 undef
   
   
 类定义  class ...
...
 end
注: 类名要常量(首字母大写)
     
 类中常数用class-name::const-name来读取
 类扩张   和类定义已将
 class ...
...
 end
 类继承
 inheritance
 class ... <
...
    def
initialize(value)
     
  super(value)
    end
  ...
 end
 类的文字输出  就是p(自定义的数据结果)时会输出的结果
 def inspect()
     return
"..."
 end
 生成类的实例  Class Sample
   ...
 end

Sample.new(...)
 Sample.create(...)

   
   
 属性的访问限制  
 attr_reader  从外部可读  类的变量
 attr_writer  从外部可写  类的变量
 attr_accessor  从外部可读写  类的变量
 方法的访问限制  
 public  对外部公开
 private  对外部保密
 protected  只能从自己这个类以及自己的类的实例访问
   
   
   
   
 模块  不能带数据
 module ...
...
 end
 模块使用  include module-name

 class-name/instance-name.extend(module-name)

静态方法还可以
 extend module-name

 查看是否包含模块  MyThird.include?(SayHello)
 查看祖先  MyThird.ancestors()
 查看直接母类  MyThird.superclass()
   
   
   
   
   
   
   
   
   
   
   
   
   
   
三种条件分支  
 if ... (then)
...
 elsif ... (then)
...
 else ... (then)
...
 end
 (then)可省略

.... if 条件

式 if 式 右边成立则运行左边
 unless ... (then)
...
 else 
...
 end
条件不成立时运行unless部分 
 case  a
 when ... (then)
...
 when ... (then)
...
 when ... (then)
...
 else 
...
 end
 就是其他语言的Switch
 注意,多个条件可以用逗号分隔

when 1, 2, 3, ....
    ...
 end

   
 6种循环语句  break
 next   相当于其他语言的continue
 redo   基本不用
 times  n = 5
 n.times do |temp|
  ...
 end
 for  for i in 0..4 
...
 end
 while  while ... 
...
 end
 until  和while相反
 each  range = 1..10
 range.each do
...
 end

增加从0开始的索引
range.each_with_index do 
 ...
end 
增加任意索引
range.each.with_index(n) do 
 ...
end

 loop  loop do
...
 end
无限循环,可用来实现其他语言的do {} while();
   
 异常处理  begin
      ...
 rescue
     ...
 ensure
     ...
 end

begin
      ...
 rescue exA1, exA2 ... => ...
     ...
 rescue exB1, exB2 ... => ...
     ...
      .
      .
      .
      .
 ensure
     ...
 end
注: $! 最后发生的异常
     
 $@最后发生的异常的位置
     
 ensure 记录最后一定要执行的部分
     
 retry 重试
     
 sleep n  暂停n秒
     
 raise 发出异常
     
 raise ex-class message
例外对象的方法
 class 异常种类
 message 异常信息
 backtrace 异常位置信息(和$!.backtrace相同)

 类似Swift ??的用法  a = Integer("abc") rescue 123
   
   
   
   
   
   
   
   
   
   
   
运算符   
范围   Range.new(1, 10)
重载   def +(rhs)
     ...
 end
 单项运算法重载  只可以+, -, ~, !
   
   
   
   
   
   
 代码块  do |a, b, c, ...|
   ...
 end

注: redo返回时候一切回到进入redo的那次循环最开始

 运行代码块  def ...
   ...
   yield
   ...
 end 
 检验是否有代码块   block_given?
 代码块类  sayHello = Proc.new() do |name|
   ...
 end
执行 sayHello.call("WACQY")
 有代码块的方法  def sample(a, b, &method)
   ...
   block.call(method)
   ...
 end

注: 带入现成代码块要加&
  sample(3, 4,
&sayHello)

   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
 
对错判断
 判断  
 true  false  不解释
 其他  false和nil为伪, 其他都为真
 
谜之编译:
 临时发现的,不知道什么鬼。先记下来。以后懂了再写
 
a = 0
while a <= 10
  case a
  when 0 then
    puts("a is 0")
  when 1 then
    puts("a is 1")
  when a > 1 && a <= 10
    puts("catch a")
  end
  a += 1
end
 
运行结果

Ruby基本语法的更多相关文章

  1. Ruby的语法糖

    发现Ruby的语法糖好多,比如函数调用,参数列表可以写括号和不写括号.代码块可以用do end 或者 {}.   还有 if,unless后置.等等. 如果看Ruby代码看多了,你会发现,它很多地方的 ...

  2. Ruby基本语法规则

    1.Ruby常用数据类型 Numbers, Strings, Booleans my_num = 25 my_boollean = true (or false) my_string = " ...

  3. [ruby on rails] 深入(2) ruby基本语法

    1. 调试&注释&打印输出 1.1 调试 ruby属于解释型语言,即脚本,在linux上,脚本的执行无非三种: 1. 用解释器运行脚本 解释器 脚本文件 即:ruby  脚本文件 2. ...

  4. ruby基础语法

    首发:个人博客,更新&纠错&回复 学不同语言,常将它们的基础语法搞混,例如if后面有没有(),后面是then还是:还是{,结尾是end还是}. 这种事情毫无技术含量又毫无乐趣可言,但极 ...

  5. ruby基本语法(2)

    关于数组 Ruby数组中的数据类型可以不相同并且长度也是可变的.(好聪明啊感觉用的久了就会变笨了,除非你本来就是老手)比如下面的例子 Myarray=[1,2,“ruby”] Ruby也支持那种-1的 ...

  6. ruby基本语法(1)

    一些学习资源 http://www.codecademy.com/zh/courses/ruby-beginner-en-d1Ylq/0/5?curriculum_id=5059f8619189a50 ...

  7. 关于Ruby常用语法案例累积

    变量问题: 类变量和方法变量的区别是什么? 类变量:可以直接使用 方法变量:需要实例化后,才能使用该变量 案例一: class Person @@name = "Tom" @@na ...

  8. 2.ruby基本语法,类的定义

    1.在ruby中的定义class,ruby中定义类也是以关键字class开头 后面带着类名,类名以大写开头.一个类的结束以关键字end 结束.如: class Customer end 2.ruby类 ...

  9. ruby puts语法

    str = "Welcom to china" str1 = str puts str + " 1" puts str1 + " 1" de ...

随机推荐

  1. [转】 nginx rewrite规则

    http://www.cnblogs.com/cgli/archive/2011/05/16/2047920.html 最近在VPS上尝试配置安装一个网站,VPS安装了LNMP(Linux+Nginx ...

  2. 向C#的选项卡中添加自定义窗体

    一.自定义窗体的搭建 这个比较简单,添加一个WinForm窗体就行了,设置一个名字EditPanel,然后在窗体上画需要的控件. 二.将自定义窗体添加到选项卡 // 新建窗体加入到选项卡中 EditP ...

  3. 淘宝数据库OceanBase SQL编译器部分 源码阅读--生成逻辑计划

    body, td { font-family: tahoma; font-size: 10pt; } 淘宝数据库OceanBase SQL编译器部分 源码阅读--生成逻辑计划 SQL编译解析三部曲分为 ...

  4. No Memory Alignment with GCC

    attribute method: #include <stdio.h> struct packed { char a; int b; } __attribute__((packed)); ...

  5. java设计模式----迭代器模式和组合模式

    迭代器模式: 提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露其内部的表示. 设计原则: 单一责任:一个类应该只有一个引起变化的原因 组合模式: 允许你将对象组合成树形结构来表现“整体/部分” ...

  6. SpringMvc參数的接受以及serializeArray的使用方法

    需求:从页面提交一个table中的数据到后台,通经常使用于批量改动 把全部的数据到放到 input属性中,设置name定义成为对象的相关属性,使用Jquery的serializeArray这种方法封装 ...

  7. Java 内存区域与内存溢出异常

    一.Java虚拟机内存划分 1.程序计数器 线程私有 可以看做是当前线程所执行的字节码的行号指示器.字节码解释器工作时是通过改变这个计数器的值来选取下一条需要执行的字节码指令. Java虚拟机是通过多 ...

  8. ArrayDeque类的使用详解

    ArrayDeque是Deque接口的一个实现,使用了可变数组,所以没有容量上的限制. 同时,ArrayDeque是线程不安全的,在没有外部同步的情况下,不能再多线程环境下使用. ArrayDeque ...

  9. 用Delphi7 调用.NET 2.0的WebService 所要注意的问题(Document格式和UTF8编码)

    Delphi7 调用VS.NET 2005开发的基于.NET 2.0的WebService时发生了错误.查阅资料 http://www.community.borland.com/article/bo ...

  10. IE9不能直接引用Console

    问题: 公司有个项目,功能很简单,读取业务数据,展示在页面上. 一个很简单的问题,却因为目标浏览器是IE9,卡了三天. 前端给的反馈是: 在IE9下,程序一会儿对,一会儿不对--第一次刷不出来,多刷几 ...