这些字符串叫什么?什么是南瓜?红宝石

Jwa*_*622 7 ruby ruby-on-rails

我发现此代码:

sql = <<-SQL.squish
        UPDATE #{klass.constantize.table_name}
           SET uuid = uuid_generate_v4(), updated_at = now()
         WHERE id IN (#{group.map(&:id).join(',')})
           AND uuid IS NULL
      SQL
Run Code Online (Sandbox Code Playgroud)

这里发生了什么?我认为这是某种特殊的字符串定界符。这叫什么?它是特定于Ruby的吗?在squish做什么

Tam*_*ash 7

这是Here文档HereDoc)的语法,它是Ruby中的多行字符串。

例如,这:

sql = <<-SQL
        UPDATE #{klass.constantize.table_name}
           SET uuid = uuid_generate_v4(), updated_at = now()
         WHERE id IN (#{group.map(&:id).join(',')})
           AND uuid IS NULL
      SQL
Run Code Online (Sandbox Code Playgroud)

将为您提供一个sql字符串变量,其值的字面值是:

         UPDATE #{klass.constantize.table_name}
           SET uuid = uuid_generate_v4(), updated_at = now()
         WHERE id IN (#{group.map(&:id).join(',')})
           AND uuid IS NULL
Run Code Online (Sandbox Code Playgroud)

保留所有空格和换行符。

从HereDoc文档中:

要在Heredoc上调用方法,请将其放在开头标识符之后

该引号的一种流行用法是当您有一个长字符串并且您不想将其写在一行上时,因此使用HereDoc,但是您仍然不想保留所有换行符和白色HereDoc保留的空格,在这种情况下,您可以调用squish(这是Rails添加的方法)将其删除。例如,这:

sql = <<-SQL.squish
        UPDATE #{klass.constantize.table_name}
           SET uuid = uuid_generate_v4(), updated_at = now()
         WHERE id IN (#{group.map(&:id).join(',')})
           AND uuid IS NULL
      SQL
Run Code Online (Sandbox Code Playgroud)

将为您提供一个sql字符串变量,其值的字面值是:

UPDATE #{klass.constantize.table_name} SET uuid = uuid_generate_v4(), updated_at = now() WHERE id IN (#{group.map(&:id).join(',')}) AND uuid IS NULL
Run Code Online (Sandbox Code Playgroud)

随之而来的所有换行符和空格都被压缩为一个空格。


Ily*_*lya 6

String#squish来自 Rails,意味着生成的内联字符串没有多个\nand \s。来自文档

返回字符串,首先删除字符串两端的所有空格,然后将剩余的连续空格组各改为一个空格。