新手问题 关于参数传递和 `binding`, `eval`.

longjiangjiang · 2018年09月21日 · 最后由 longjiangjiang 回复于 2018年09月24日 · 990 次阅读

最近本人在刷 LeetCode,所选的语言是 ruby,刷到 86 题 partition list。

小弟代码如下:

def append_list(head, tail, node, vars)
    if head.nil?
        eval "head = node", vars
        eval "tail = node", vars
        # head, tail = node, node
    else
        eval "tail.next = node", vars
        eval "tail = node", vars
        # tail.next = node
        # tail = node
    end
end


def partition(head, x)
    return head if head.nil? || head.next.nil?

    left, right = nil, nil

    while head && head.val < x
        node = head
        head = head.next
        node.next = nil
        append_list(left, right, node, binding)
    end

    if head
        p = head
        while p.next
            if p.next.val < x
                node = p.next
                p.next = node.next
                node.next = nil
                append_list(left, right, node, binding)
            else
                p = p.next
            end
        end
    end

    append_list(left, right, node, binding)

    left
end

主要是 append_list 方法,因为 ruby 中参数传递的是拷贝,不是引用,所以查了下需要用 binding,但是小弟改了代码,使用了 eval 的形式,但是运行时却死循环了,所以想请教下各位大佬,哪里写错了。

因为 ruby 中参数传递的是拷贝,不是引用

确定?

ecnelises 回复

准备的说应该是引用的拷贝吧。

知道了,最简单的方法把 append_list 参数列表改成 (left, right, node, vars) 即可;

需要 登录 后方可回复, 如果你还没有账号请 注册新账号