ruby强制整数和字符串

ruby强制整数和字符串,ruby,Ruby,我是鲁比新手 我试图编写一个非常简单的计算器,将数字存储在变量中,并检查运算符的用户输入是否包含在可能的运算符数组中,如果是,则应使用这些变量执行计算 有没有办法把这三个变量结合起来得到结果?现在正在向我抛出错误“字符串不能强制转换为整数” 您可以使用public\u send num1.public\u发送(op,num2) 但更明确的方法是只使用if/else语句 if op == "+" num1 + num2 elsif op == "-"

我是鲁比新手

我试图编写一个非常简单的计算器,将数字存储在变量中,并检查运算符的用户输入是否包含在可能的运算符数组中,如果是,则应使用这些变量执行计算

有没有办法把这三个变量结合起来得到结果?现在正在向我抛出错误“字符串不能强制转换为整数”


您可以使用
public\u send

num1.public\u发送(op,num2)

但更明确的方法是只使用if/else语句

if op == "+"
  num1 + num2
elsif op == "-"
  num1 - num2
elsif op == "*"
  num1 * num2
elsif op == "/"
  num1 / num2
end

您可以使用
public\u send

num1.public\u发送(op,num2)

但更明确的方法是只使用if/else语句

if op == "+"
  num1 + num2
elsif op == "-"
  num1 - num2
elsif op == "*"
  num1 * num2
elsif op == "/"
  num1 / num2
end
使用对象#发送方法 您当前的代码无法工作,因为您试图将op(当前为字符串)附加到整数。实际上,您要做的是通过向第一个整数发送适当的消息来调用该方法,并将第二个数字作为参数传递给该方法。您可以通过以下方式执行此操作:

print "Enter a number: "
num1 = Integer gets

loop do
  print "Enter an operator: "
  op = gets.strip
  break if %w[+ - / *].include? op
end

print "Enter another number: "
num2 = Integer gets

p num1.send(op, num2)
撇开其他修改和重构不谈,正是使用了#send才允许这种方法工作。当然,还有很多其他方法可以表示您正在尝试执行的操作,但这一种方法确实有效。

使用Object#send方法 您当前的代码无法工作,因为您试图将op(当前为字符串)附加到整数。实际上,您要做的是通过向第一个整数发送适当的消息来调用该方法,并将第二个数字作为参数传递给该方法。您可以通过以下方式执行此操作:

print "Enter a number: "
num1 = Integer gets

loop do
  print "Enter an operator: "
  op = gets.strip
  break if %w[+ - / *].include? op
end

print "Enter another number: "
num2 = Integer gets

p num1.send(op, num2)

撇开其他修改和重构不谈,正是使用了#send才允许这种方法工作。当然,还有很多其他方法可以表示您正在尝试做的事情,但这一种方法确实有效。

让我们将您的示例分解为更简单的内容:

num1 = 1
num2 = 2
op = '+'
result = num1 + op + num2
当您尝试分配
结果时,实际发生的情况如下:

result = 1 + '+' + 2
Ruby reports
字符串无法强制转换为整数,因为它正在尝试将字符串
+
添加到整数
1
中,而Ruby无法将字符串添加到整数中。您可以在上阅读更多关于此的信息

您可以用一个更简单的例子来重现它:

1 + '+'
TypeError: String can't be coerced into Integer
if operators.include?(op)
  result = num1.public_send(op, num2)
else
  puts "enter a valid operator"
end
在您的问题中,您说它应该使用这些变量执行计算,因此我假设您期望
结果
等于
3
。(因为它应该根据这三个变量计算
1+2
)由于上述原因,
result=…
行中不会出现这种情况

正确的方法是使用
public\u send
,如以下关于堆栈溢出的问题和答案所述:

因此,答案是:

num1.public_send(op, num2)
=> 3
并集成到您的示例中:

1 + '+'
TypeError: String can't be coerced into Integer
if operators.include?(op)
  result = num1.public_send(op, num2)
else
  puts "enter a valid operator"
end

让我们将您的示例分解为更简单的内容:

num1 = 1
num2 = 2
op = '+'
result = num1 + op + num2
当您尝试分配
结果时,实际发生的情况如下:

result = 1 + '+' + 2
Ruby reports
字符串无法强制转换为整数,因为它正在尝试将字符串
+
添加到整数
1
中,而Ruby无法将字符串添加到整数中。您可以在上阅读更多关于此的信息

您可以用一个更简单的例子来重现它:

1 + '+'
TypeError: String can't be coerced into Integer
if operators.include?(op)
  result = num1.public_send(op, num2)
else
  puts "enter a valid operator"
end
在您的问题中,您说它应该使用这些变量执行计算,因此我假设您期望
结果
等于
3
。(因为它应该根据这三个变量计算
1+2
)由于上述原因,
result=…
行中不会出现这种情况

正确的方法是使用
public\u send
,如以下关于堆栈溢出的问题和答案所述:

因此,答案是:

num1.public_send(op, num2)
=> 3
并集成到您的示例中:

1 + '+'
TypeError: String can't be coerced into Integer
if operators.include?(op)
  result = num1.public_send(op, num2)
else
  puts "enter a valid operator"
end

您可以使用a代替
if
/
elsif
来避免重复比较。您可以使用a代替
if
/
elsif
来避免重复比较。不太清楚“组合”是什么意思。您对
num1=1
op=“+”
num2=2
的预期结果是什么?字符串
“1+2”
或整数
3
?不太清楚“组合”是什么意思。您对
num1=1
op=“+”
num2=2
的预期结果是什么?字符串
“1+2”
或整数
3