- xml - AJAX/Jquery XML 解析
- 具有多重继承的 XML 模式
- .net - 枚举序列化 Json 与 XML
- XML 简单类型、简单内容、复杂类型、复杂内容
大家好。我正在使用 Shoes 为 Ruby 项目制作 GUI。
我有一个名为 Manager 的类(如在内存管理器中),它从文件中加载“进程列表”,将其拆分并在进行某个执行调用时将内容分配给内存中的不同“页面”。不过,我真的认为这部分并不重要。这一切都可以作为终端应用程序正常工作。
但是,Shoes 只是让我感到困惑。到目前为止,这是我得到的:
Shoes.app(:title => "Paging Simulator", :width => 800, :height => 450) do
@manager = Manager.new
stack(:width => 200) do
@exec_list = stack {
title "Execution Queue", :size => 14
@exec_lines = para "click button to load", :size => 9
@file_button = button "Load Process List"
@file_button.click {
filename = ask_open_file
# @manager.set_exec_list filename
# alert "this makes no sense"
@exec_lines.text = @manager.exec_list.join "\n"
# exec_lines.text = File.read filename
}
}
end
end
当我运行这个时会发生什么:
程序 View 按预期加载。我得到一个标题,一段写着“点击按钮......”的段落,以及一个按钮。我单击按钮并选择文件。但这就是事情变得奇怪的地方。
如果我运行最后一条注释行 exec_lines.text = File.read filename
它会按照我的意愿运行,但我的经理没有得到它需要的任何信息。
如果我运行 @manager.set_exec_list filename
行, block 中该行的 nothing 会运行,包括 alert
,或我尝试放入其中的任何其他代码。
但是,如果我按上面所示运行,我会得到我期望的输出,但我无法从我选择的文件中设置我的数据。
我试图从 Shoes Rules 中找出答案页面,但这似乎不是他们解决的问题,我想我理解他们的“它改变/不改变 self ”,但它令人困惑,我认为它与这个问题并不完全相关。
有人知道如何让它工作吗?我在这个项目上有点紧迫,而且我似乎无法让任何其他 Ruby GUI 工具包运行,所以我认为我对 Shoes 很着迷。
谢谢。
更新当我调用 @manager.set_exec_list filename
时,我尝试在代码上运行 ruby-debug,并单步执行显示调用已完成,但代码实际上从未(从我的角度来看) can tell) 跳转到那个方法,并且表现得好像它是代码块中的最后一行代码。我是否需要将这些类包含在 Shoes.app
block 中?更新 不。这没有什么不同。
更新完整源代码如下:
#!/usr/bin/env shoes
require 'rubygems'
require 'ruby-debug'
class MemSegment
attr_accessor :filled, :pid, :seg, :seg_id
def initialize(filled=false, pid=nil, seg=nil, seg_id=0)
@filled = filled
@pid = pid.to_i
@seg = seg.to_s
@seg_id = seg_id.to_i
self
end
def fill(pid, seg, seg_id)
@filled = true; @pid = pid; @seg = seg; @seg_id = seg_id;
self
end
def clear
self.filled = false; self.pid = nil; self.seg = nil;
self
end
def filled?
@filled
end
def to_s
filled? ? "#{seg} #{seg_id} for pid #{pid}" : "Free"
end
end
class SimProc
include Enumerable
attr_accessor :pid, :code, :data
def initialize(pid, code, data)
@pid = pid.to_i
@code = code.to_i
@data = data.to_i
end
def each
yield :code, code
yield :data, data
end
def to_s
"[SimProc :pid => #{pid}, :code => #{code}, :data => #{data}]"
end
def to_a
[@pid, @code, @data]
end
end
class Manager
attr_reader :segments, :processes, :exec_list, :exec_object
def initialize
@exec_list = [[1, 2], [3, 4], [5, 6]]
@processes = {}
@segments = Array.new(8) { MemSegment.new }
end
def print_activity
@segments.each_with_index {|s, index| puts "Seg #{index} => #{s}" }
@processes.each_value {|s| puts s }
end
def load_process(pcb, exec_index)
if pcb.size == 3
p = SimProc.new(*pcb)
bad_load = false
@processes.store p.pid, p
@processes[p.pid].each do |proc_seg, bsize|
(bsize / 512.0).ceil.times do |seg_id|
@segments.each_with_index do |s, index|
if !s.filled
#find the first empty memory segment
s.fill p.pid, proc_seg, seg_id
break
# if all slots are filled and we couldn't place a proc block
elsif index == @segments.size - 1
bad_load = true
puts "Cannot find a place for #{proc_seg} segment of size #{bsize}. Requeueing..."
break;
end
end
break if bad_load
end
end
# recover pages and queue the process for later
if bad_load
@segments.each_with_index do |seg, seg_index|
# clear any segments that didn't get loaded properly
if seg.pid == p.pid
seg.clear
puts "Seg #{seg_index} => segment cleared: #{seg}"
end
end
# reinsert this process after the next in the execution list
# it will attempt to load and run after the next process is performed
@exec_list.insert(exec_index + 2, p.to_a)
end
print_activity
elsif pcb.size == 2 and pcb[1] == -1
# a process is exiting
puts "removing pid #{pcb[0]}"
@segments.each { |s| s.clear if s.pid == pcb[0] }
@processes.delete pcb[0]
print_activity
end
end
def set_exec_list(filename)
file = File.open filename
file.each { |pcb| @exec_list << pcb.split.map(&:to_i) } unless file.nil?
filename
end
def main
exseq = File.open('exseq2.txt')
set_exec_list exseq
# this is the object that will be used to run each process with .next
@exec_object = @exec_list.each_with_index
# @exec_list.each_with_index { |pcb, exec_index| load_process(pcb, exec_index) }
(@exec_list.size + 1).times do
load_process(*@exec_object.next)
end
end
end
=begin
manager = Manager.new
manager.main
=end
#=begin
Shoes.app(:title => "Paging Simulator", :width => 800, :height => 450) do
@manager = Manager.new
stack(:width => 200) do
@exec_list = stack {
title "Execution Queue", :size => 14
@exec_lines = para "click button to load", :size => 9
@file_button = button "Load Process List"
debugger
@file_button.click {
filename = ask_open_file
@manager.set_exec_list filename
# alert "this makes no sense"
# @exec_lines.text = @manager.exec_list
# @exec_lines.text = File.read filename
@exec_lines.text = @manager.exec_list.join "\n"
}
}
end
end
#=end
最佳答案
所以,有几件事:
#1,我没有Manager
的实现,所以我不能告诉你它为什么会崩溃。您是否尝试检查 Shoes 控制台是否有任何错误?点击 control-/调出它。如果“到达那条线后没有任何东西运行”,那可能就是问题所在。
#2,这对我有用,只要您在最后一行将 exec_lines
更改为 @exec_lines
即可。这是我尝试过的:
class Manager;end
Shoes.app(:title => "Paging Simulator", :width => 800, :height => 450) do
@manager = Manager.new
stack(:width => 200) do
@exec_list = stack {
title "Execution Queue", :size => 14
@exec_lines = para "click button to load", :size => 9
@file_button = button "Load Process List"
@file_button.click {
filename = ask_open_file
#alert "this makes no sense"
@exec_lines.text = File.read filename
}
}
end
end
希望对您有所帮助!
关于ruby - Shoes 中实例变量的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5736957/
我想创建一个基于 jQuery 的非常简单的 html 编辑器(不是所见即所得)。 我的问题是如何制作 textarea或 div可能 在上面写一些文字 然后样式即标签(例如 some stuff 将
根据文档 isset 条款“测试此项目中是否已设置给定属性”。我不明白设置属性时 isset 返回 true 还是 false 在下面的代码片段中,当 env.JAVA_HOME 未设置时,java.
我正在尝试取消映射 o这是执行 :only 的默认命令( :help :only ),所以我尝试的第一件事是: nmap o 这种作品,除非我按 ,等待超过timeoutlen ms 然后按 o
我有以下型号: class MetaData(models.Model): created_at = models.DateTimeField(auto_now_add=True, auto_
下面列出了两行代码。两者对日期和时间的期望相同,但只有一个有效。我正在使用 R 3.1。 以下不起作用: DateTime2=strftime("08/13/2010 05:26:24.350", f
我有一个关于 C 代码的问题。 #include void foo(void){ int a; printf("%d\n",a); } void bar(void){
如果文件大小 > 8k,为什么读取的最后一个字节 = 0? private static final int GAP_SIZE = 8 * 1024; public static void main(
我有一个命令 Get-Testdata从不同来源检索测试数据并将这些数据存储到 PSObject以不同的值作为属性。然后将对象总数存储为数组,以便于操作、排序、计算等。 我的问题是我希望能够将这些数据
我正在使用 epoll 将大消息写入使用 HTTP 协议(protocol)的服务器。 fds 都设置为非阻塞,我正在使用边缘触发事件。我知道对于 EPOLLIN,我需要循环读取 fd,直到返回 EA
这对我来说听起来很奇怪: $test_1 = 'string'; $test_2 = '0'; var_dump(intval($test_1)); // Output: int 0 var_dump
这个问题在这里已经有了答案: Java: Integer equals vs. == (7 个回答) 7年前关闭。 请您解释以下行为。 public class EqAndRef { publ
Drupal 的行为到底是什么? 它为模块开发人员提供什么类型的服务层? 它映射到 jQuery.ready 的关系类型是什么? 最佳答案 长版:Drupal.behaviors 不仅仅是 jQuer
以下代码: dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{ for (int i=0
人们可以将项目添加到数据库中。我让他们选择在此时添加它,或手动选择日期。 因此我得到了这个 HTML 结构。 (请注意,我将日期和时间选择器妥协为只有一行文本) Selec
创建了一个数据框: simpleDF is.na(simpleDF$vals) [1] TRUE TRUE FALSE > is.nan(simpleDF$vals) [1] FALSE TRU
我有一个大的 docker 镜像 A,我创建了一个新的 Dockerfile FROM A RUN rm /big-folder 我尝试使用以下方法构建图像: docker build --squas
我想知道以下情况下 JVM 的行为是什么: JVM 最小堆大小 = 500MB JVM 最大堆大小 = 2GB 操作系统有 1GB 内存 JVM启动后,程序运行一段时间后,使用内存超过1GB。我想知道
我们正在使用 spikeearrest 策略,但我们不了解其工作原理。峰值逮捕配置如下: 5pm 阅读文档,我们了解到,如果我们在一分钟内调用此流超过 5 次,则该策略将在第 5 次之后
我正在使用 cURL 发送 POST 请求: curl http://tarvos.local:8080/partial_Users/2 -d '{currentPage : 1, firstID :
我的表中有 6442670 条记录,我正在使用以下命令获取它们jdbctemplate 使用行号一次 1000000 个。以下是查询 select * from (select rowNum rn
我是一名优秀的程序员,十分优秀!