gpt4 book ai didi

ruby - 在 Ruby 中使用 String#to_proc 实现 to_s(2)

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

我正在学习一元运算符 &

关于在方法调用的参数中使用 & 有一些很好的问题。通常格式类似于 some_obj.some_method(&:symbol):

似乎主要思想是当一元运算符放在符号前面时,ruby 调用 :symbol 上的 to_proc 方法。因为 Symbol#to_proc 存在“一切正常”。

我仍然对一切如何运作感到困惑。

如果我想实现“带有字符串的 to_proc 类功能”怎么办?我把它放在引号中是因为我什至不确定如何谈论我正在尝试做的事情。

但我们的目标是编写一个 String#to_proc 方法,使以下工作正常:

class String
def to_proc # some args?
Proc.new do
# some code?
end
end
end
p result = [2, 4, 6, 8].map(&'to_s 2')
#=> ["10", "100", "110", "1000"]

我是这样做的:

class String
def to_proc
Proc.new do |some_arg|
parts = self.split(/ /)
some_proc = parts.first.to_sym.to_proc
another_arg = parts.last.to_i
some_proc.call(some_arg, another_arg)
end
end
end
p result = [2, 4, 6, 8].map(&'to_s 2')
#=> ["10", "100", "110", "1000"]

我感到困惑的主要部分是如何将参数获取到 String#to_proc 方法中。看起来像:

def to_proc
Proc.new do |some_arg| ...
end

应该是:

def to_proc some_arg
Proc.new do |yet_another_arg| ...
end

或者类似的东西。 [2, 4, 6, 8] 值如何进入 String#to_proc 返回的过程?

最佳答案

就这样写

[2, 4, 6, 8].map { |each| each.to_s(2) }

虽然我猜这不是你要找的......

下面是 Symbol#to_proc 的实现方式。

class Symbol
def to_proc
proc { |each| each.send(self) }
end
end

如果你愿意,你可以在数组上定义to_proc,如下所示

class Array
def to_proc
symbol, *args = self
proc { |each| each.send(symbol, *args) }
end
end

然后使用

[2, 4, 6, 8].map(&[:to_s, 2])

另一种选择是使用 curry

尽管这不适用于绑定(bind)方法,因此您必须先定义一个 to_s lambda 函数。

to_s = lambda { |n, each| each.to_s(n) }

[2, 4, 6, 8].map(&to_s.curry[2])

尽管所有这些看起来更像是学术练习。

关于ruby - 在 Ruby 中使用 String#to_proc 实现 to_s(2),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41371266/

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