Ruby中的常量:引号、%符号和heredoc
数值字面量
没什么好说的,唯一需要说明的是分数字面量:数值后加上一个后缀字母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)
- 注意,shell命令的输出结果需要保存到变量中,否则结果被丢弃。例如
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的开头行继续向后读取,所以上面<<END
和END
中间的行先被读取,读取完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的更多相关文章
- MySQL 中的反引号(`):是为了区分 MySql 关键字与普通字符而引入的符号;一般,表名与字段名都使用反引号。
MySQL 中的反引号(`):是为了区分 MySql 关键字与普通字符而引入的符号:一般,表名与字段名都使用反引号.
- [No000010]Ruby 中一些百分号(%)的用法小结
#Ruby 中一些百分号(%)的用法小结 #这篇文章主要介绍了Ruby 中一些百分号(%)的用法小结,需要的朋友可以参考下 what_frank_said = "Hello!"#% ...
- ruby中symbol
Symbol 是什么 Ruby 是一个强大的面向对象脚本语言(本文所用 Ruby 版本为1.8.6),在 Ruby 中 Symbol 表示“名字”,比如字符串的名字,标识符的名字. 创建一个 Symb ...
- Java内存中的常量池
1,java内存模型简介 <深入理解java虚拟机>里将java内存分为如下五个模块: 堆-堆是所有线程共享的,主要用来存储对象. 其中,堆可分为:新生代和老年代两块区域.使用NewRat ...
- [翻译]理解Ruby中的blocks,Procs和lambda
原文出处:Understanding Ruby Blocks, Procs and Lambdas blocks,Procs和lambda(在编程领域被称为闭包)是Ruby中很强大的特性,也是最容易引 ...
- shell中常用的特殊符号
在shell中常用的特殊符号罗列如下: # ; ;; . , / \ 'string'| ! $ ${} $? $$ $* "string"* ** ? : ^ $# $@ `co ...
- android官方技术文档翻译——Case 标签中的常量字段
本文译自androd官方技术文档<Non-constant Fields in Case Labels>,原文地址:http://tools.android.com/tips/non-co ...
- ruby中printf "%x"%-4为何会打印开头..
先看一下ruby中printf "%x" % -4的返回结果: irb(main):134:0> printf "%x\n" % -4 ..fc 前面的. ...
- ruby中的alias和alias_method
ruby中的alias和alias_method都可以重命名一个方法,它们的区别如下: 1.alias是ruby的一个关键字,因此使用的时候是alias :newname :oldname alias ...
随机推荐
- Unity3d基础组件 (Component) 和脚本 (Script) 关系
原版的:http://edu.china.unity3d.com/learning_document/getData?file=/Manual/TheComponent-ScriptRelations ...
- WPF 用Clip属性实现蒙板特效
原文:WPF 用Clip属性实现蒙板特效 上一篇,已简单介绍Clip属性的用法,这一篇用它来实现简单蒙板功能,很简单,直接上代码 <Window x:Class="擦除效果.MainW ...
- CefSharp For WPF基本使用
原文:CefSharp For WPF基本使用 Nuget引用 CefSharp.Wpf CefSharp.Common cef.redist.x64 cef.redist.x86 直接搜索安装Cef ...
- C# NetCore使用AngleSharp爬取周公解梦数据 起因和页面数据拆解
起因 最近突然心血来潮想做个小程序,学习一下小程序开发流程,然后新手就想做个查询的就可以了,少点交互能力,这种思来想去还是周公解梦比较靠谱, 网上一搜,还真有小程序源码,但是这里面似乎数据都是取第三方 ...
- MIME映射(程序映射)
MIME(Multipurpose Internet Mail Extensions)多用途互联网邮件扩展类型.是设定某种扩展名的文件用一种应用程序来打开的方式类型,当该扩展名文件被访问的时候,浏览器 ...
- x:Static
用途:访问代码中的变量等 后台定义一个变量 public partial class GetStaticFromBackgroundCode : Window { public static stri ...
- IDEA 问题 & 解决
# 问题 Error: java: Compilation failed: internal java compiler error # 解决 http://blog.csdn.net/u011275 ...
- MyBatis 模板
mybatis-config.xml: <?xml version="1.0" encoding="utf-8"?> <!DOCTYPE co ...
- 【WPF】SnapsToDevicePixels与UseLayoutRounding二者到底有什么区别?供参考
原文:[WPF]SnapsToDevicePixels与UseLayoutRounding二者到底有什么区别?供参考 MSDN上解释了一大堆,二者对比来看,并不能发现什么明显的区别,微软爸爸也不知道多 ...
- WPF 资源(StaticResource 静态资源、DynamicResource 动态资源、添加二进制资源、绑定资源树)
原文:WPF 资源(StaticResource 静态资源.DynamicResource 动态资源.添加二进制资源.绑定资源树) 一.WPF对象级(Window对象)资源的定义与查找 实例一: St ...