“未定义的方法”+&引用;Ruby中的数值类
这是通过Rinda使用元组空间,我在这里有一堆“put”来查看控制台中的每个步骤,但我认为这并不重要。重要的是当我运行这段代码时:“未定义的方法”+&引用;Ruby中的数值类,ruby,methods,numeric,Ruby,Methods,Numeric,这是通过Rinda使用元组空间,我在这里有一堆“put”来查看控制台中的每个步骤,但我认为这并不重要。重要的是当我运行这段代码时: while(true) ts.take(["empty"]) tag, rear = ts.read( ["rear", Numeric]) puts "11" value = 7 puts "12" ts.write(["buf", rear, value]) puts "13" puts
while(true)
ts.take(["empty"])
tag, rear = ts.read( ["rear", Numeric])
puts "11"
value = 7
puts "12"
ts.write(["buf", rear, value])
puts "13"
puts "have some words"
puts "14"
tag, rear = ts.take( ["rear", Numeric])
puts "15"
(rear += 1) % n = rear
puts "16"
ts.write(["rear", Numeric])
puts "17"
ts.write(["full"])
puts "18"
end
我得到一个错误:
数值类(NoMethodError)的未定义方法“+”
为什么??我该如何解决这个问题 当您创建一个数字时,您创建了
数值类(或继承自数值类的类)的实例。+
方法适用于数值类的实例-它是一种实例方法。你是在课堂上打电话
是一个不寻常的类,因为它不使用new
初始化该类的新实例。相反,数字是直接创建的(您不必执行n=Numeric.new(3)
——您只需执行n=3
)。但是类和实例之间的关系是相同的,类的类方法应用于类,实例方法(包括+
)应用于实例
Ruby类可以被认为是该类实例的构建器或工厂。实际上,你已经在创造数字的东西上调用了+
,而不是在第一个问题上调用了数字
这是一种有趣的写作方式:
(rear = rear + 1) % (n = rear)
这意味着:
- 将后<代码>增加1
- 将
n
设置为rear
- 返回
rear%rear
,即0
你想要:
rear = (rear + 1) % n
第二个问题
rear被定义为数字,而不是数字(0、1或3.1415…)
它来自哪里?有一个无限循环,所以罪魁祸首可能在你得到错误的那一行之后
在16
和17
之间,您可以使用:
ts.write(["rear", Numeric])
这就是你的问题。应该是:
ts.write(["rear", 3.14]) # or
ts.write(["rear", rear])
3个脚本使其工作
01_server.rb
02_your_script.rb
试验
- 在终端中启动ruby 01_server.rb
- 在另一个终端中启动您的脚本.rb
ruby 02
它输出:
11
12
13
have some words
14
15
"Rear is now : 1"
16
循环停止,等待“清空”
- 在另一个终端中启动
03_switch.rb
,循环将无限重复
具体在哪里提出了NoMethodError
?您希望(rear+=1)%n=rear
做什么?它在“put 15”之后停止运行并返回错误。我希望它在后面加1,然后模n。n在返回相同错误的代码中定义为80。我认为问题不在于赋值语句,而在于数值类是如何工作的?什么是放在后面的。在放“15”
返回后检查?它只返回:NumericOkay,这很有意义(特别是在阅读数值类之后)。你建议我怎么解决这个问题?我已经阅读了使用rear.to int的建议,但是这会返回一个类似的错误(.to int/to int undefined)ts.take([Numeric])
应该返回一个数值实例,并且它似乎返回Numeric
类。这是没有意义的,至少根据我找到的几个例子是没有意义的。哈哈,是的,这是一种愚蠢的输入方式,但我这样做是因为我实际上已经尝试了rear=(rear+1)%n,它返回了同样该死的错误。老实说,我打算再问我的教授一次,如果他不知道,我就继续我的另一个期末考试。第一个问题仍然存在。你是如何定义你的价值观的?你在哪里定义你的价值观!我猜rear是一个数值类的实例的名称,我以前把rear称为数值类本身?无论如何,谢谢你的朋友!确切地我的荣幸,学习Rinda很有趣,我以前从未使用过它。
require 'rinda/tuplespace'
URI = "druby://localhost:61676"
DRb.start_service(URI, Rinda::TupleSpace.new)
DRb.thread.join
require 'rinda/rinda'
URI = "druby://localhost:61676"
DRb.start_service
ts = Rinda::TupleSpaceProxy.new(DRbObject.new(nil, URI))
#######################################
# This needs to happen before your loop
ts.write(["rear", 0])
ts.write(["empty"])
n = 80
#######################################
loop do
ts.take(["empty"])
tag, rear = ts.read( ["rear", Numeric])
puts "11"
value = 7
puts "12"
ts.write(["buf", rear, value])
puts "13"
puts "have some words"
puts "14"
tag, rear = ts.take( ["rear", Numeric])
puts "15"
rear = (rear + 1) % n
p "Rear is now : #{rear}"
puts "16"
# ts.write(["rear", Numeric]) # <- This was wrong. You don't want to write Numeric, the class.
ts.write(["rear", rear]) # You want to write a Numeric, e.g. rear
ts.write(["full"])
end
require 'rinda/rinda'
URI = "druby://localhost:61676"
DRb.start_service
ts = Rinda::TupleSpaceProxy.new(DRbObject.new(nil, URI))
loop do
ts.take(["full"])
ts.write(["empty"])
end
11
12
13
have some words
14
15
"Rear is now : 1"
16