又再测试一下,发现前面讲的 A::B 是一个完整的名字,是错的,因为能访问到单独的 B, p A.ancestors #=>[A, Object, Kernel, BasicObject] p A::B.ancestors #=>[A::B] p A.constants[0] #=>:B p A.constants[0].class #=>Symbol 能看到的 A 既是类也是模块,再深入看到上面的结果又迷糊了
发现"C:\Ruby33-x64\lib\ruby\3.3.0\mkmf.rb", https://github.com/ruby/rake,https://github.com/mruby/mruby 可以爬一下
这点我的感觉正好相反,ruby 的 oop 更直观,更强大,至少跟 C++ 比起来,ruby 的 oop 更顺手
ffi,fiddle 都有在用,只是有时候想在 c/c++ 中直接跟 ruby 交互
Ruby 确实好,碰上 Ruby,有点不想用其它的样子
好像你回答的是重写方法时创建别名的过程(或者结果),但是我需要了解的是重写方法时如果不创建别名,结果将是怎样的?会不会原方法被覆盖了?(内存中不再有原方法的实现代码),mizuhashi 的回答更接近答案,不知道我理解的有没有问题
非常感谢
除了速度,综合来讲可以完败其它语言,还好现实世界有不少的事件不是时间敏感的,而且 ruby 速度也没那么不堪
问题自己摸出来了,应该这样定义任务 task :default => ["main.exe"]
file "main.exe" => OBJFILES do |t| sh "gcc -o #{t.name} main.o a.o b.o" end
原教程 task :default => [:main] file "main" => OBJFILES do |t| sh "gcc -o #{t.name} main.o a.o b.o" end
然后在 windows 下,原教程产生不了 main 文件(实际产生的是 main.exe)
原教程应该是对 linux 有效,windows 则需要改改
我想创建各种轮子
我用 ruby 制作 window 桌面 gui 应用框架
我自己用 Ruby 在做 windows 下的桌面 app 框架,已初具效果,UI 已经做到运行时动态增删,达到 wysiwyg 了,而且手工配置的部分已经做到比 json,yaml,xml 直观太多了!
这是手工配置文件的样子
{ applications{
aio(CAppDemo){
title=mls "aio 测量系统" version="0.0.2" software_version="0.0.0"
font_name=mls "宋体" font_size=30
prop_int=127{ title=mls "亮度" default=0 llimit=0 ulimit=444 mouse_wheel=1.0
} def_prop_cmd_line
begin_def_measure_val{
prop_mesure_float=-0.0{ title=mls "半径" unit=UnitTypeMM
std=0.0 correct=0.05 llimit=-0.5 ulimit=0.5 }
end_def_measure_val}
light_adj=127{ title=mls "亮度" }
app_idle_time=0.0{ title=mls "程序空闲时间" unit=UnitTypeMS format="%6.3f" editable=false #read_only= true }
app_idle_proc_time=0.0{
title=mls "程序空闲处理时间" unit=UnitTypeMS format="%6.3f" }
worktable{ pos{ x=0.0{ title=mls "X" llimit=-100.0 ulimit=100.0 } y=0.0{ title=mls "Y" } ff=0.0{ title=mls "Z" } } }
time_for_show_caret=0.5{ title=mls "定时显示光标"
llimit=0.1 ulimit=1.0 mouse_wheel=0.01 unit=UnitTypeMS
}
ui_config=false{ title="配置 UI" }
test_mesure_val=0{
}
length_unit=UnitTypeMM{ title=mls "长度单位" vals=[UnitTypeMM,UnitTypeInch,UnitTypeMil] } angle_unit=UnitTypeDu{ title=mls "角度单位" vals=[UnitTypeDu,UnitTypeHuDu,UnitTypeDFM] } time_unit=UnitTypeS{ title=mls "时间单位" vals=[UnitTypeH,UnitTypeM,UnitTypeS,UnitTypeMS,UnitTypeUS] } vel_unit=UnitTypeMMPerS{ title=mls "速度单位" vals=[UnitTypeMMPerS,UnitTypeDuPerS,UnitTypePlusPerS] } show_dyn_prompt=true{ title=mls "显示动态提示" } user_type=PermissionUser{
}
} } }
完善控件后,用 RAIO(我给这个框架起的名字)在做项目时,程序员只需要用内置的功能就可以用 wysiwyg 的方式快速生成 UI,然后接下来就是直接进入 app 逻辑的编写
从 CObj 派生的类不需要写 attr_accessor,你只管按路径写法去读写你程序用到的属性,不存在就自动生成,而其默认值就是 nil 例: 写:$root.os.applications.app.main_frm.rect.val=[0,0,640,480] 读:$root.os.applications.app.main_frm.rect.val 这里除了$root 是需要主动生成之外,其它后面的路径节点都是不存在就动态产生,无需在类中先 attr_accessor
配置文件的写法,比其它什么 json,yaml,xml 直观得太多了!
当然也可以在自动产生的代码中加入手工写的代码来增加控件
上面的 UI 配置是程序自动产生的,只有 app 配置是手定的
已经可以运行中进行控件的增删及自由布局,并自动保存改变, UI 的设计不象现有的多数软件是在设计时进行,都在运行时通过鼠标拖拽完成,无需手写代码,真正达到 wysiwyg 的效果了
Kao,这格式都丢失了~!@#¥%……&*
这是 UI 配置的样子 PermissionUser.password="" PermissionEngine.password="1" PermissionAdmin.password="11" PermissionSuper.password="111"
{ (CWinDlg, NameFrmMain){ (CWinTitleBar, at: AlignTypeTop, as: AlignSizeToTextHeight, name: NameAppTitleBar){ new_btn(FunWinClose) new_btn(FunWinMaximize) new_btn(FunWinMinimize) new_btn(FunMoveWin) new_btn(FunELine) new_btn(FunERect) new_btn(FunMakeUI) title="aio 测量系统 0.0.0" } (CWinStatusBar, at: AlignTypeBottom, as: AlignSizeToTextHeight, name: NameStatusBar){ (CWin, at: AlignTypeRight, as: 100){ title="CWin_7880" } (CWin, at: AlignTypeRight, as: 150, name: NameCmdStatistics){ title="1/0/1" } new_prop_win($root.os.applications.aio.prop_int, at: AlignTypeRight, as: 200) title="退出" } (CWinPanel, at: AlignTypeRight, as: 1019, name: NameRightBar){ (CWinTab, at: AlignTypeClient, as: 0){ (CWinPropGrid, at: AlignTypeClient, as: 0, name: NameGridAppProp){ (CWin, at: AlignTypeRight, as: 150){ title="CWin_9300" } new_prop($root.os.applications.aio.app_idle_time) new_prop($root.os.applications.aio.app_idle_proc_time) new_prop($root.os.applications.aio.time_for_show_caret) new_prop($root.os.applications.aio.show_dyn_prompt, class: CWinPropbool) new_prop($root.os.applications.aio.refresh_wins) new_prop($root.os.applications.aio.prop_int) new_prop($root.os.applications.aio.prop_int) new_prop($root.os.applications.aio.prop_int) new_prop($root.os.applications.aio.prop_int) new_prop($root.os.applications.aio.prop_int) new_prop($root.os.applications.aio.prop_int) new_prop($root.os.applications.aio.prop_int) new_prop($root.os.applications.aio.prop_mesure_float) prop_split=300 title="程序属性" } (CWinPropGrid, at: AlignTypeClient, as: 0, name: NameGridDocProp){ prop_split=300 title="文档属性" } (CWinPropGrid, at: AlignTypeClient, as: 0, name: NameGridCmdProp){ prop_split=300 title="命令属性" } (CWinPropGrid, at: AlignTypeClient, as: 0, name: NameGridActiveEntityProp){ prop_split=300 title="活动图元属性" } (CWinGridReport, at: AlignTypeClient, as: 0, name: NameReport){ title="报表" } active_page=0,NoNotical fir_visible=0 } (CWinPanel, at: AlignTypeTop, as: 300){ (CWinCoorBar, at: AlignTypeClient, as: 0, name: NameCoorBar){ prop_split=274 title="NameCoorBar" } (CWinLightCtrlBar, at: AlignTypeRight, as: 200, name: NameLightCtrlBar){ rings=4 areas=8 title="NameLightCtrlBar" } title="CWinPanel_12760" } title="NameRightBar" } (CWinPanel, at: AlignTypeClient, as: 0){ (CWinCanvas, at: AlignTypeClient, as: 0, name: :canvas){ title="canvas" } (CWinCmdBar, at: AlignTypeBottom, as: 300, name: NameCmdBar){ title="NameCmdBar" } title="CWinPanel_19580" } frm_rect.val=CRect.new [0, 0, 2560, 1600] modal_frm.val= true title="NameFrmMain" } }
这是配置文件的样子 { applications{
aio(CAppDemo){
title=mls "aio 测量系统" version="0.0.2" software_version="0.0.0"
font_name=mls "宋体" font_size=30
prop_int=127{ title=mls "亮度" default=0 llimit=0 ulimit=444 mouse_wheel=1.0
} def_prop_cmd_line
begin_def_measure_val{
prop_mesure_float=-0.0{ title=mls "半径" unit=UnitTypeMM
std=0.0 correct=0.05 llimit=-0.5 ulimit=0.5 }
end_def_measure_val}
light_adj=127{ title=mls "亮度" }
app_idle_time=0.0{ title=mls "程序空闲时间" unit=UnitTypeMS format="%6.3f" editable=false #read_only= true }
app_idle_proc_time=0.0{
title=mls "程序空闲处理时间" unit=UnitTypeMS format="%6.3f" }
worktable{ pos{ x=0.0{ title=mls "X" llimit=-100.0 ulimit=100.0 } y=0.0{ title=mls "Y" } ff=0.0{ title=mls "Z" } } }
time_for_show_caret=0.5{ title=mls "定时显示光标"
llimit=0.1 ulimit=1.0 mouse_wheel=0.01 unit=UnitTypeMS
}
ui_config=false{ title="配置 UI" }
test_mesure_val=0{
}
length_unit=UnitTypeMM{ title=mls "长度单位" vals=[UnitTypeMM,UnitTypeInch,UnitTypeMil] } angle_unit=UnitTypeDu{ title=mls "角度单位" vals=[UnitTypeDu,UnitTypeHuDu,UnitTypeDFM] } time_unit=UnitTypeS{ title=mls "时间单位" vals=[UnitTypeH,UnitTypeM,UnitTypeS,UnitTypeMS,UnitTypeUS] } vel_unit=UnitTypeMMPerS{ title=mls "速度单位" vals=[UnitTypeMMPerS,UnitTypeDuPerS,UnitTypePlusPerS] } show_dyn_prompt=true{ title=mls "显示动态提示" } user_type=PermissionUser{
}
} } }
还好,坚持做了,有点收获了