我刚学会了php中的静态变量.红宝石中有类似的东西吗?
例如,如果我们想要为我们创建的Student每个student对象创建一个类,它的id号应该自动增加.
我认为创建类变量作为静态会做.
作为一个编程练习,我编写了一个Ruby片段,它创建了一个类,从该类中实例化了两个对象,monkeypatches一个对象,并依赖于method_missing来monkeypatch另一个.
这是交易.这按预期工作:
class Monkey
def chatter
puts "I am a chattering monkey!"
end
def method_missing(m)
puts "No #{m}, so I'll make one..."
def screech
puts "This is the new screech."
end
end
end
m1 = Monkey.new
m2 = Monkey.new
m1.chatter
m2.chatter
def m1.screech
puts "Aaaaaargh!"
end
m1.screech
m2.screech
m2.screech
m1.screech
m2.screech
Run Code Online (Sandbox Code Playgroud)
你会注意到我有一个method_missing的参数.我这样做是因为我希望使用define_method动态创建具有适当名称的缺失方法.但是,它不起作用.实际上,即使使用带有静态名称的define_method也是如此:
def method_missing(m)
puts "No #{m}, so I'll make one..."
define_method(:screech) do
puts "This is the new screech."
end
end
Run Code Online (Sandbox Code Playgroud)
结束以下结果:
ArgumentError: wrong number of arguments (2 for 1) …Run Code Online (Sandbox Code Playgroud) 我想知道是否有可能创建一个二维数组并快速访问其中的任何水平或垂直子数组?
我相信在以下情况下我们可以访问水平子数组:
x = Array.new(10) { Array.new(20) }
x[6][3..8] = 'something'
Run Code Online (Sandbox Code Playgroud)
但据我了解,我们无法像这样访问它:
x[3..8][6]
Run Code Online (Sandbox Code Playgroud)
我怎样才能避免或破解这个限制?
我刚开始玩JRuby.这是我的第一篇红宝石帖子.我很难理解Ruby中的类和对象.它并不意味着像其他面向对象的laguages中的类和对象.举个例子
Class.is_a? Object
Run Code Online (Sandbox Code Playgroud)
返回true 和
Object.is_a? Object
Run Code Online (Sandbox Code Playgroud)
也是.
所以class&Object都是对象
这是另一个
Class.is_a? Class
Run Code Online (Sandbox Code Playgroud)
返回true 和
Object.is_a? Class
Run Code Online (Sandbox Code Playgroud)
也是.
等等,我还没完成
Object.instance_of? Class
Class.instance_of? Class
Run Code Online (Sandbox Code Playgroud)
两者都是真的
Object.instance_of? Object
Class.instance_of? Object
Run Code Online (Sandbox Code Playgroud)
两者都是假的.对,没有什么可以是对象的实例.
和
Class.kind_of? Class
Object.kind_of? Class
Run Code Online (Sandbox Code Playgroud)
两者都是真的
Class.kind_of? Object
Object.kind_of? Object
Run Code Online (Sandbox Code Playgroud)
两者都是真的
所以两者完全相同,那为什么我们都有这两个.
经过一番挖掘,我写了这个简单的方法来返回两者支持的方法列表
irb(main):054:0> def print_methods(obj)
irb(main):055:1> obj.methods.each do |mm|
irb(main):056:2* puts mm
irb(main):057:2> end
irb(main):058:1> end
Run Code Online (Sandbox Code Playgroud)
print_methods(Object)和print_methods(Class)之间只有方法差异
Nesting
Run Code Online (Sandbox Code Playgroud)
如果嵌套意味着继承,Is Object类似于密封类?
有人可以澄清一下这是什么吗?
更新:给Edds评论
有趣的是,我在方法列表中看到了很多不同之处
c=Class.new
print_methods(c)
Run Code Online (Sandbox Code Playgroud)
&
o=Object.new
print_methods(o)
Run Code Online (Sandbox Code Playgroud)
现在我理解一个类的实例实际上是一个类实例(而这个类实例实际上是一个Object)而不是一个对象实例.甚至这个实例也允许我跨越另一个实例
xx = c.new //works - c is …Run Code Online (Sandbox Code Playgroud) 当我尝试使用ruby和win32ole使用以下代码设置一个较长的工作表名称时:
require "win32ole"
excel = WIN32OLE.new('Excel.Application')
excel.Visible = 1
puts excel.version
workbook = excel.Workbooks.Add
worksheet1 = workbook.Worksheets.Add
worksheet1.Name = "Pseudopseudohypoparathyroidism" #Length 30, fine
worksheet2 = workbook.Worksheets.Add
worksheet2.Name = "Supercalifragilisticexpialidocious" #Length 34, not fine
Run Code Online (Sandbox Code Playgroud)
我得到以下内容:
12.0
-:9:in `method_missing': (in setting property `Name': ) (WIN32OLERuntimeError)
OLE error code:800A03EC in Microsoft Office Excel
You typed an invalid name for a sheet or chart. Make sure that:
The name that you type does not exceed 31 characters.
The name does not contain any of …Run Code Online (Sandbox Code Playgroud) 来自Ocaml社区,我正在尝试学习一些Haskell.过渡进展顺利,但我对调试有点困惑.我曾经在我的ocaml代码中放置(很多)"printf",检查一些中间值,或者作为标志来查看计算完全失败的位置.
由于printf是一个IO动作,我是否必须解除IO monad中的所有haskell代码才能进行这种调试?或者有更好的方法来做到这一点(如果可以避免,我真的不想手工做)
我也找到了跟踪功能:http: //www.haskell.org/haskellwiki/Debugging#Printf_and_friends 这看起来正是我想要的,但我不明白它的类型:任何地方都没有IO!有人能解释一下跟踪功能的行为吗?
我有代码:
def make_all_thumbs(source)
sizes = ['1000','1100','1200','800','600']
threads = []
sizes.each do |s|
threads << Thread.new(s) {
create_thumbnail(source+'.png', source+'-'+s+'.png', s)
}
end
end
Run Code Online (Sandbox Code Playgroud)
什么<<意思?
我正在寻找与sscanf()Python 相当的东西.我想解析/proc/net/*文件,在CI中可以做这样的事情:
int matches = sscanf(
buffer,
"%*d: %64[0-9A-Fa-f]:%X %64[0-9A-Fa-f]:%X %*X %*X:%*X %*X:%*X %*X %*d %*d %ld %*512s\n",
local_addr, &local_port, rem_addr, &rem_port, &inode);
Run Code Online (Sandbox Code Playgroud)
我首先想到的是str.split,但是它不会拆分给定的字符,而是整个sep字符串:
>>> lines = open("/proc/net/dev").readlines()
>>> for l in lines[2:]:
>>> cols = l.split(string.whitespace + ":")
>>> print len(cols)
1
Run Code Online (Sandbox Code Playgroud)
如上所述,应该返回17.
是否有一个等价于sscanf(不是RE)的Python ,或者标准库中的字符串拆分函数,它分裂了我不知道的任何一系列字符?
我正在尝试定义一个块,我将用它来传递多个范围的每个方法.我不想在每个范围上重新定义块,而是想创建一个lamba,并传递lambda:
count = 0
procedure = lambda {|v| map[count+=1]=v}
("A".."K").each procedure
("M".."N").each procedure
("P".."Z").each procedure
Run Code Online (Sandbox Code Playgroud)
但是,我收到以下错误:
ArgumentError: wrong number of arguments(1 for 0)
from code.rb:23:in `each'
有什么想法在这里发生了什么?