Ruby获取一个运算符并使其作为一个运算符工作

ztmd8pv5  于 2023-01-30  发布在  Ruby
关注(0)|答案(3)|浏览(178)

菜鸟到了极点。
我怎样才能使这个运算符工作?

puts "Tell me a number"
num1 = gets
puts "Tell me an another number"
num2 = gets
puts "Tell me an operator"
op = gets

puts num1.to_i op num2.to_i
qni6mghb

qni6mghb1#

在Ruby中,运算符基本上就是一个方法。

puts num1.to_i.public_send(op.chomp, num2.to_i)

使用Object#public_send,你可以发送一个用String或Symbol指定的(公共)方法。注意如果你的Ruby版本太旧,你可能需要用send替换public_send

rlcwz9us

rlcwz9us2#

正如您在其他答案中所看到的,您可以使用send(或public_send)来调用方法。
有一个问题:gets包含一个换行符(例如+\n)。to_i方法可以处理这个问题。send尝试找到一个带有换行符的方法(但找不到)。因此,您必须从运算符中删除换行符(使用strip-方法)。
完整的例子是:

puts "Tell me a number"
num1 = gets
puts "Tell me an another number"
num2 = gets
puts "Tell me an operator"
op = gets

puts num1.to_i.send( op.strip,  num2.to_i)

我建议在阅读后立即转换这些值,这样以后的工作会更容易:

puts "Tell me a number"
num1 = gets.to_i
puts "Tell me an another number"
num2 = gets.to_i
puts "Tell me an operator"
op = gets.strip

puts num1.public_send( op,  num2)

请注意,不检查有效操作符。当您输入

1
2
u

你会得到一个undefined method 'u' for 1:Integer (NoMethodError)错误。

tzxcd3kk

tzxcd3kk3#

共享的public_send方法已经工作得很好了,但这里有一个替代方法。

puts num1.to_i.method(op.chomp).(num2.to_i)

它基本上使用[Object#method][1][Method#call][1]做了完全相同的事情。我发现了这一点,感谢this post和@ArapRakshit,在那里我得到了我需要的答案。

相关问题