• 🙏 🙏 🙏 🙏 🙏 🙏 我已经激动地给大佬跪下了! 这个问题困扰了我 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 循环,有点不适应。