我只知道,ruby 对于 macOS,是必须的存在。
我已经激动地给大佬跪下了! 这个问题困扰了我 2 周,还把提供 SDK 的供应商工程师一顿臭骂,甚至动摇了我对 Ruby 的信仰。 今天终于解决了!!! 还是自己的知识不够全面,再次谢谢大佬的指点!!!
node 的版本冲突问题,简直就是噩梦
感谢大哥回复,但我的意思是不是这个。 我现在遇到的问题是需调用一个 Win32 的 COM 控件,用 Python 行得通,但是用 Ruby 就真的遇到问题了。 例如,现在需要调用 某个 Win32 COM 控件 my_com 的某个方法 my_method,这个方法在 SDK 中的说明如下:
VARIANT_BOOL my_method
(LONG UserID,
BSTR *Name,
BSTR *Password
)
这个方法的 input parameter 是 UserID,另外两个带星号的参数是 output parameter 或者说是 reference parameter,也就是返回值。
用 python 很容易解决这个问题:
# 下面的 xxxxx.xxxxx 是 COM 控件对象,例如 Excel.Application
my_com = win32com.client.Dispatch('xxxxx.xxxxx')
myUserID = '10001'
# python 只需要这样,方法在调用时不需要写返回值参数,myName, myPassword 直接作为返回值
myUserID, myName, myPassword = my_com.my_method(myUserID)
print(myName) # "张三"
print(myPassword) # "888888"
我尝试了 Ruby,按照 ruby-doc 网站http://ruby-doc.com/stdlib-2.6.5/libdoc/win32ole/rdoc/WIN32OLE.html中的例子,效果不理想,获取不到返回值:
require "win32ole"
include WIN32OLE::VARIANT
# 下面的 xxxxx.xxxxx 是 COM 控件对象,例如 Excel.Application
my_com = WIN32OLE.new('xxxxx.xxxxx')
# 直接调用
myUserID = '10001'
myName = ''
myPassword = ''
p my_com.my_method(myUserID, myName, myPassword) # 返回 True,证明确实执行了
p WIN32OLE::ARGV # 返回 ['10001', '', ''],没有获取到返回值
# 换一种方法
myUserID = WIN32OLE_VARIANT.new('10001', VT_I4)
myName = WIN32OLE_VARIANT.new('', VT_BSTR)
myPassword = WIN32OLE_VARIANT.new('', VT_BSTR)
p mycom.invoke('my_method', myUserID, myName, myPassword) # 返回 True,证明确实执行了
p myName.value # 返回 "",仍然没有获取到返回值
p myPassword.value # 返回 "",仍然没有获取到返回值
谢谢大家,社区真温暖!
我可能没说清楚,一个更简单的例子: 我想在 create 成功后,问一下用户是要跳转到 show 还是 index,这应该怎么做?
确实,def_method 可以共享上下文的作用域。
用 proc 也可以,但不要写 return,顺便简化掉 call:
def method1(param)
proc { |x| param.push(x); param }
end
method2 = method1([])
p method2.(1)
p method2.(5)
p method2.(10)
p method2.(15)
楼主的函数嵌套写法,一看就是 python 过来的。 我就是受不了这样代码,才弃 python 而去。(还有就是 python 没有 end,感觉一个鞋子始终没落地,看着糟心)
我也是初学 Ruby,但 Ruby 似乎一般不会直接 return 另一个方法,而是 return 一个 proc 或 lambda。 二楼和三楼的写法都有问题:二楼的不能把 param 返回到最外,三楼的需要在方法外定义 param。 我试着写了一下: 用 lambda 代替 proc,就可以 return param; 把 param 作为参数传递给 method1,就解决方法外定义 param 的问题。 应该满足楼主的需求了:
def method1(param)
lambda { |x| param.push(x); return param }
end
method2 = method1([])
p method2.call(1)
p method2.call(5)
p method2.call(10)
p method2.call(15)
# >[1]
# >[1, 5]
# >[1, 5, 10]
# >[1, 5, 10, 15]
看到 for 循环,有点不适应。