gpt4 book ai didi

ruby - 如何使自定义 Ruby 类型的行为像字符串一样?

转载 作者:数据小太阳 更新时间:2023-10-29 07:48:48 25 4
gpt4 key购买 nike

如果我有一个表示某种字符串类型的自定义 Ruby 类,如

class MyString
end

为了使以下用例成为可能,我应该实现哪些功能:

  1. 每当需要 MyString 时传递 Ruby 字符串
  2. 每当需要 Ruby 字符串时传递 MyString
  3. 将 Ruby 字符串与 MyString 值进行比较(无论我使用 s == t 还是 t == s 都不重要).

我已经看到了各种有趣的函数,例如 to_scmp==eq,但事实并非如此当他们中的每一个被调用时我都清楚。

我的具体用例是,我正在使用 C API 编写一个 Ruby 扩展,它公开获取(并返回)自定义字符串类型(准确地说是 QString)值的函数,我的扩展也注册了该类型。但是,我想让这些自定义字符串尽可能直观。不幸的是,我不能只从我的 C 代码返回 Ruby 字符串,因为应该可以在字符串上调用 Qt 方法。

最佳答案

至少有三种方法:

  1. class MyString < String; ...; end
  2. 定义#to_s
  3. 定义#to_str

同时执行#2 和#3 将使对象表现得非常像一个真正的字符串,即使它不是子类也是如此。

#to_s是一个显式转换器, 意味着它必须出现在 Ruby 代码中才能工作。

#to_str是一个隐式转换器, 意味着 Ruby 解释器将在需要 String 但被提供其他内容时尝试调用它。

更新:

这是您可以通过 to_str 获得的一些乐趣的示例:

begin
open 1, 'r'
rescue TypeError => e
p e
end
class Fixnum
def to_str; to_s; end
end
open 1, 'r'

运行时,第一次打开失败并显示 TypeError但第二个继续寻找1 .

#<TypeError: can't convert Fixnum into String>
fun.rb:9:in `initialize': No such file or directory - 1 (Errno::ENOENT)
from fun.rb:9:in `open'

关于ruby - 如何使自定义 Ruby 类型的行为像字符串一样?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6748788/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com