当前位置:首页 > 后端开发 > 正文内容

Ruby 的 heredoc 与 eval

邻居的猫1个月前 (12-09)后端开发1769

在如 rails 这样的开源库中,咱们常常见到这样的一类写法:

class_eval <<-RUBY, __FILE__, __LINE__ + 1
  def xxx
    # do something here
  end
RUBY

令人困惑不已。

不过这儿的知识点非常简略,只需把握了 heredoc 与 eval 的用法,就很好了解这儿的代码了。

heredoc

heredoc 是一种界说多行字符串的办法,一起坚持原始缩进和格局。相当于 JavaScript 中的 ``。

heredoc 以 <<- 最初,跟上一个随意的单词,最终再以这个字符串完毕:

multi_str = <<-FOO
1
  2
    3
FOO

puts multi_str

多行字符串会保存一切的缩进,并且在尾部会带上 \n 换行符。

关于换行符,能够运用 chomp 来去除:<<-FOO.chomp

假如你在缩进的情况下声明 heredoc,可能会变成这样,非常丑恶:

    multi_str = <<-FOO
1
  2
    3
    FOO

假如坚持缩进:

    multi_str = <<-FOO
    1
      2
        3
    FOO

最终的输出成果也会带上 1 一切缩进,这儿能够运用 ~ 替代 -,或是运用 strip

    multi_str = <<~FOO
    1
      2
        3
    FOO
    multi_str = <<-FOO.strip
    1
      2
        3
    FOO

这两种办法都会以榜首行为规范,在一切行的最初,删去空格。

eval

eval 在许多脚本语言中都存在,它能够让咱们将字符串作为代码履行。

ruby 中存在多个 eval 办法,比方 eval class_eval module_eval instance_eval 等。

他们别离能够完成不同的 eval 功用。

class_eval 为例:

class Foo
  STR = <<-RUBY
    def say
      p 'I am Foo'
    end
  RUBY

  Module.class_eval STR
end

Foo.say

咱们能够轻松将字符串变成办法。

代码剖析

现在咱们总算能够看懂这段代码了,它其实便是运用了 heredoc 多行字符串,将字符串里变成了一个真实的 ruby 办法。

class_eval <<-RUBY, __FILE__, __LINE__ + 1
  def xxx
    # do something here
  end
RUBY

那么后边的 __FILE__, __LINE__ + 1 有什么用呢?

其实咱们完全能够不传这两个参数。

可是参加咱们字符串生成的办法报了错该怎么办呢?一般咱们的办法报错都会有文件名、行号。

eval 运用字符串生成办法,天然没有这些东西,所以咱们传入当时文件的文件名,和当时行的行号+1,来协助 Ruby 生成更好的报错信息。

(完)

扫描二维码推送至手机访问。

版权声明:本文由51Blog发布,如需转载请注明出处。

本文链接:https://www.51blog.vip/?id=208

分享给朋友:

“Ruby 的 heredoc 与 eval” 的相关文章

一步步在 github pages 上用 jekyll 建立归于自己的博客

一步步在 github pages 上用 jekyll 建立归于自己的博客

序 我的专业与互联网没有太大联系,触摸博客仍是作业今后的作业。跟着作业的经历添加,总想将自己的所思所得记录下来,究竟,好记忆不如烂笔头。 开端是将自己的总结在本地保存,可是本地有一个下风,便是不能随时随地的检查,最重要的是,不能随时随地的装X,所以,最终转到了简书,转到简书,是17年的时分,那个...

R言语求取很多遥感印象的平均值、标准差:raster库

R言语求取很多遥感印象的平均值、标准差:raster库

  本文介绍根据R言语中的raster包,批量读取多张栅格图画,对多个栅格图画核算平均值、标准差,并将所得新的栅格成果图画保存的办法。   在文章根据R言语的raster包读取遥感印象中,咱们介绍了根据R言语raster包,对单张或多张栅格图画加以平均值、标准差核算的办法;但这一篇文章中的标准差核算...

go与go to的区别,深入解析“go”与“go to”的区别

go与go to的区别,深入解析“go”与“go to”的区别

Go 和 go to 在英语中虽然都含有“去”的意思,但它们的用法和含义有所不同。1. Go 是一个动词,表示“去”的动作。它可以单独使用,也可以与介词、副词等搭配使用,表示不同的方向、目的地等。例如: I'm going to the store.(我要去商店。) He goes to...

swift最新版本,Swift 6的发布背景

swift最新版本,Swift 6的发布背景

Swift的最新版本是Swift 6.0。在不久前的苹果全球开发者大会(WWDC)上,苹果正式发布了Swift 6.0。这个版本带来了许多重要的更新和改进,包括语言和标准库的增强、改进的调试工具、跨平台库的扩展以及对嵌入式开发和生产力工具的支持。Swift 6.0的发布标志着Swift语言在多个方面...

python应用领域,Python应用领域的广泛探索与未来展望

python应用领域,Python应用领域的广泛探索与未来展望

1. Web开发:Python拥有许多流行的Web框架,如Django、Flask等,这些框架可以帮助开发者快速构建Web应用程序。2. 数据分析:Python在数据分析领域非常受欢迎,拥有Pandas、NumPy、SciPy等强大的数据分析库。这些库提供了丰富的数据操作和分析功能,使得Python...

python缩进规则,二、Python 缩进规则概述

python缩进规则,二、Python 缩进规则概述

在Python编程语言中,缩进规则是编写代码时必须遵守的重要规则之一。Python使用缩进来表示代码块的结构,而不是像其他编程语言那样使用大括号({})或分号(;)来定义代码块。下面是Python缩进规则的一些关键点:1. 使用空格或制表符:Python中的缩进可以通过空格或制表符来实现。但是,建议...