Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
“未定义的方法”+&引用;Ruby中的数值类_Ruby_Methods_Numeric - Fatal编程技术网

“未定义的方法”+&引用;Ruby中的数值类

“未定义的方法”+&引用;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

这是通过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 "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