ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

Ruby中的常量:引号、%符号和heredoc

2019-05-03 16:49:02  阅读:189  来源: 互联网

标签:解释 shell heredoc 引号 符号 Ruby 表达式


引号

引号和Perl中的引号类似。

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

%符号

%用于简化常量的定义

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

  • %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"]

标签:解释,shell,heredoc,引号,符号,Ruby,表达式
来源: https://www.cnblogs.com/f-ck-need-u/p/10805582.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有