通过创建新的字符串对象来调用字符串的方法

戈斯瓦米

好的,所以我有一个方法 colourize 在字符串类中动态修补:

class String
    @@colours = [[154, 184, 208, 203, 198, 164, 129, 92], [63, 33, 39, 44, 49, 83, 118], [40,41,42,43,211, 210, 209, 208]].tap { |itself| itself.concat(itself.map(&:reverse)) }

    define_method(:colourize) do |final = ''|
        colour = @@colours.sample
        colour_size = colour.size - 1
        index, div, val = 0, length / colour_size, ''
        div = 1 if div == 0
        colour_size -= 1

        each_char.with_index do |c, i|
            index += 1 if (i % div == 0 && index < colour_size) && i > 1
            val.concat("\e[38;5;#{colour[index]}m#{c}")
        end

        val + "\e[0m" + final
    end
end

这会为 String 对象着色(仅在 Linux 系统上的 BASH shell 中测试)。但是我每次都必须编写colourize方法。

puts 'Hello World'.colourize

有没有办法修补 String 以便在创建“Hello World”或将其分配给变量时,默认情况下会调用 colourize 方法?

修补 String#intialize 并不简单。

斯特凡

有没有办法修补 String 所以 [...] 默认情况下,它会调用 colourize 方法?

这是一个坏主意。字符串是 Ruby 的基础,就像数组、散列和符号一样。无论如何,将颜色代码放入每个创建的字符串中,很可能会破坏某些内容。

您应该只在实际打印字符串时添加颜色代码(并且可能仅在您打印到 tty 时)。

这将我们带到puts. 它将给定的对象写入标准输出,如果需要,将它们转换为字符串。不幸的是,一个字符串不需要任何转换,所以调用to_s被跳过,我们没有方法可以挂钩。

但是String我们可以修补顶级,而不是 patching puts

(我upcase用于演示目的,因为我无法在此处呈现 ANSI 转义序列)

def puts(*args)
  Kernel.puts(*args.map { |a| a.is_a?(String) ? a.upcase : a })
end

puts 'hello'

输出:

HELLO

由于修补核心类是一项肮脏的工作,让我们看看是否可以找到更清洁的方法。的文档Kernel.puts说:

相当于 $stdout.puts(obj, ...)

这听起来很有希望:$stdout作为一个全局变量可以很容易地改变。我们所需要的只是一个提供自定义puts方法并将任何其他方法委托给原始标准输出的对象。SimpleDelegator是为了:

class OutputDecorator < SimpleDelegator
  def puts(*args)
    super *args.map { |a| a.is_a?(String) ? a.upcase : a }
  end
end

试一试吧:

puts 'before'

$stdout = OutputDecorator.new($stdout)

puts 'within'

$stdout = $stdout.__getobj__

puts 'after'

输出:

before
WITHIN
after

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

用字符串创建对象

来自分类Dev

用字符串创建对象

来自分类Dev

使用字符串调用方法

来自分类Dev

通过变量(字符串)调用对象和方法

来自分类Dev

通过变量(字符串)调用对象和方法

来自分类Dev

通过从现有字符串中复制字符并通过“结果”数组返回新字符串来创建新的字符串?

来自分类Dev

用字符串变量调用Javascript对象

来自分类Dev

Matlab:如何使用字符串调用对象属性?

来自分类Dev

使用字符串格式的对象调用依赖项

来自分类Dev

Java使用字符串作为对象调用

来自分类Dev

Matlab:如何使用字符串调用对象属性?

来自分类Dev

调用字符串/对象到adodb连接

来自分类Dev

使用字符串调用对象和函数

来自分类Dev

从字符串创建方法调用

来自分类Dev

使用字符串作为名称创建对象

来自分类Dev

如何使用字符串创建File对象

来自分类Dev

使用字符串值作为className来调用方法

来自分类Dev

创建字符串对象的最佳方法

来自分类Dev

用字符串调用表

来自分类Dev

用字符串调用变量

来自分类Dev

JavaScript调用字符串

来自分类Dev

使用字符串方法解析字符串

来自分类Dev

使用字符串参数调用AndroidJni静态方法

来自分类Dev

用字符串和input()调用方法

来自分类Dev

使用字符串调用Java中的方法

来自分类Dev

C#使用字符串调用方法

来自分类Dev

Javascript反射,使用字符串调用方法

来自分类Dev

使用字符串调用Java中的方法

来自分类Dev

用字符串数组循环对象