数值字面量

没什么好说的,唯一需要说明的是分数字面量:数值后加上一个后缀字母r表示分数字面量。

# 整数字面量
0
1
100
10_000_001   # 千分位

# 浮点数字面量
0.1
1.0
1.2222

# 分数字面量
1r                  # 等价于(1/1)
2r                  # 等价于(2/1)
0.3r                # 等价于(3/10)
0.4r-0.1r           # 等于(2/5) - (1/10) == (3/10)
0.4r-0.1r == 0.3r   # true

引号

引号和Perl中的引号类似。

例如,单引号不解释变量内插和反斜线序列等,双引号解释变量内插和反斜线序列等,反引号用于执行对应的命令。此外,反引号中可以进行变量内插,也就是说反引号中字符的会按照双引号进行解释,例如a=haha;str=`echo #{a} one line`得到的结果为str=haha one line

此外,Ruby支持三引号,包括三个双引号、三个单引号,用来实现简单的heredoc功能。双引号可以进行变量内插,单引号不可变量内插:

one=1
two=2
three=3

puts """
line #{one}
line #{two}
line #{three}
"""

puts '''
line #{one}
line #{two}
line #{three}
'''

%符号

%用于简化常量的定义

下面的中括号边界符可以替换为其它对称符号或相同的符号。例如()<>||##

  • %q[]:定义字符串,但不解释内插表达式。例如%q(abc def)等价于"abc def",边界符(即这里的中括号[])需要使用反斜线转义
  • %Q[]%[]:定义字符串,但解释内插表达式。例如a="abc"时,b=%Q(#{a})等价于b="abc"
  • %w[]%W[]:定义数组,数组元素不需要引号包围,数组元素使用空白符号(可以是换行符)分隔
  • %i[]:创建符号数组。例如%i(Perl Python)等价于[:Perl, :Python]
  • %r[]:定义正则表达式,会解释内插表达式。此外,正则的修饰符可以出现在边界符的后面,例如%r(a.*b)i表示不区分大小写的正则对象
  • %s[]:定义符号(Symbol),不会解释内插表达式
  • %x[]:定义要执行的shell命令,就像shell下的反引号一样,这部分会被当作双引号包围,会解释内插表达式
    • 注意,shell命令的输出结果需要保存到变量中,否则结果被丢弃。例如a=%x(echo hahaha)表示将echo的输出结果保存到变量a中,而%x执行的过程中并不输出数据
    • 它和Ruby中的反引号是一样的。它们都是调用Kernel模块中的`方法,所以,也可以直接调用这个方法执行一段shell命令:Kernel.`(echo hahaha)

heredoc

heredoc和Perl的heredoc基本一样。

  • <<END:等价于双引号的heredoc
  • <<"END":按双引号去解释heredoc内容,所以会解释内插表达式和反斜线序列
  • <<'END':按单引号去解释heredoc内容,所以不会解释内插表达式和反斜线序列
  • <<`END`:使用shell去执行heredoc的内容
str1 = <<END
one line
END
# str1="one line"

a="one line"
str2 = <<"END"
#{a}
END
# str2="one line"

a="one line"
str3 = <<'END'
#{a}
END
# str3="#{a}"

a="one line"
str4 = <<`END`
echo haha #{a}
END
# str4="haha one line"

heredoc的起始符前可以加上一个短横线"-",使得终止符可以缩进编写,还可以使用~,使得正文和结束符都能缩进,但返回的结果不缩进。例如:

str1 = <<-ONE
one line
  ONE          # 终止符ONE缩进了

str2 = <<-"TWO"
two\nline      # 换行符被解释
  TWO

puts <<~END
  one line    # 结果中,这两行没缩进
  two line
END

heredoc的起始行中起始符后面的内容不会被解释。所以:

arr = [<<END, "two", "three"]  # END后面的不会解释
one line
END

# arr = ["one line", "two", "three"]

事实上,当Ruby解释器遇到<<的时候就立即跳转到它下面的行中读取数据直到遇到结尾符号,然后重新回到here doc的开头行继续向后读取,所以上面<<ENDEND中间的行先被读取,读取完END之后回头读two、three字符串。

heredoc可以堆叠多个doc栈。例如:

arr = [<<ONE, <<TWO, <<THREE,]
one line
ONE
two line
TWO
three line
THREE

# arr=["one line", "two line", "three line"]

Ruby中的常量:引号、%符号和heredoc的更多相关文章

  1. MySQL 中的反引号(`):是为了区分 MySql 关键字与普通字符而引入的符号;一般,表名与字段名都使用反引号。

    MySQL 中的反引号(`):是为了区分 MySql 关键字与普通字符而引入的符号:一般,表名与字段名都使用反引号.

  2. [No000010]Ruby 中一些百分号(%)的用法小结

    #Ruby 中一些百分号(%)的用法小结 #这篇文章主要介绍了Ruby 中一些百分号(%)的用法小结,需要的朋友可以参考下 what_frank_said = "Hello!"#% ...

  3. ruby中symbol

    Symbol 是什么 Ruby 是一个强大的面向对象脚本语言(本文所用 Ruby 版本为1.8.6),在 Ruby 中 Symbol 表示“名字”,比如字符串的名字,标识符的名字. 创建一个 Symb ...

  4. Java内存中的常量池

    1,java内存模型简介 <深入理解java虚拟机>里将java内存分为如下五个模块: 堆-堆是所有线程共享的,主要用来存储对象. 其中,堆可分为:新生代和老年代两块区域.使用NewRat ...

  5. [翻译]理解Ruby中的blocks,Procs和lambda

    原文出处:Understanding Ruby Blocks, Procs and Lambdas blocks,Procs和lambda(在编程领域被称为闭包)是Ruby中很强大的特性,也是最容易引 ...

  6. shell中常用的特殊符号

    在shell中常用的特殊符号罗列如下: # ; ;; . , / \ 'string'| ! $ ${} $? $$ $* "string"* ** ? : ^ $# $@ `co ...

  7. android官方技术文档翻译——Case 标签中的常量字段

    本文译自androd官方技术文档<Non-constant Fields in Case Labels>,原文地址:http://tools.android.com/tips/non-co ...

  8. ruby中printf "%x"%-4为何会打印开头..

    先看一下ruby中printf "%x" % -4的返回结果: irb(main):134:0> printf "%x\n" % -4 ..fc 前面的. ...

  9. ruby中的alias和alias_method

    ruby中的alias和alias_method都可以重命名一个方法,它们的区别如下: 1.alias是ruby的一个关键字,因此使用的时候是alias :newname :oldname alias ...

随机推荐

  1. arcserver开发小结(一)

    一.关于属性查询 由于要做属性查询,又重新玩起了arcmap中的select by attribute,有很多自己当初玩弄arcmap多年还不是很清楚的东西 1,字段名 (1)file geodata ...

  2. WPF中样式和行为和触发器

    原文:WPF中样式和行为和触发器 样式简介:样式(style)是组织和重用格式化选项的重要工具,不是使用重复的标记填充XAML,以便设置外边距.内边距.颜色以及字体等细节.而是创建一系列封装所有这些细 ...

  3. OpenExpressApp:精通 WPF UI Virtualization

    原文:OpenExpressApp:精通 WPF UI Virtualization 本篇博客主要说明如何使用 UI Virtualization(以下简称为 UIV) 来提升 OEA 框架中 Tre ...

  4. WPF 中style文件的引用

    原文:WPF 中style文件的引用 总结一下WPF中Style样式的引用方法: 一,内联样式: 直接设置控件的Height.Width.Foreground.HorizontalAlignment. ...

  5. Nancy Web框架

    原文 Nancy Web框架 Nancy框架 一.创建第一个Nancy应用 二.探索Nancy的module 1. 模块能够在全局被发现 2. 使用模块为路由创建一个根 三.定义路由 1. 方法 2. ...

  6. qt下的时钟程序(简单美丽,继承自QWidget的Clock,用timer调用update刷新,然后使用paintEvent作画就行了,超详细中文注释)good

    最近抽空又看了下qt,发现用它来实现一些东西真的很容易比如下面这个例子,绘制了个圆形的时钟,但代码却清晰易懂[例子源自奇趣科技提供的例子]因为清晰,所以就只写注释了,吼吼其实也就这么几行代码头文件 / ...

  7. ${FUNCNAME[@]}和$LINENO使用

    $LINENO代表shell脚本的当前行号 [root@mysql-B ~]# cat test1.sh #!/bin/bash trap 'echo “before execute line:$LI ...

  8. Android零基础入门第6节:配置优化SDK Manager,正式约会女神

    原文:Android零基础入门第6节:配置优化SDK Manager,正式约会女神 在前几期中总结分享了Android的前世今生.Android 系统架构和应用组件那些事.带你一起来聊一聊Androi ...

  9. ASP.NET获取客户端、服务器端基础信息

    1. 在ASP.NET中专用属性: 获取服务器电脑名:Page.Server.ManchineName 获取用户信息:Page.User 获取客户端电脑名:Page.Request.UserHostN ...

  10. Android零基础入门第82节:Activity数据回传

    上一节学习了将简单的数据从MainActivity传递到SecondActivity,本节一起来学习数据如何从SecondActivity回传到MainActivity. 一.简介 前面己经提到,Ac ...