当密钥存在时,Julia的字典方法`haskey`返回false

时间:2015-06-02 03:02:45

标签: dictionary equality julia

我是朱莉娅的新手,我不确定为什么最后一行评估为假:

type Point{T}
  x::T
  y::T
end

D = [Point(1.,2.) => 42]
haskey(D, Point(1., 2.))  #False!

显然关键存在,所以这里发生了什么!?

修改

如果我不使用课程Point,它可以正常工作:

D = [(1.,2.) => 42]
haskey(D, (1., 2.))  #True!

我们不能将类用于字典键类型吗?

2 个答案:

答案 0 :(得分:6)

但是看看这个:

<a href='#awesome' data-toggle='modal'><input type = 'button' class = 'btn btn-primary' value = 'Click Here' > </a>
.... </html>

<div class='modal fade' id='awesome' role='dialog'>
<div class='modal-dialog' style='width: 600px;'>
    <div class='modal-content' style=''>
        <div class='modal-header'>
            <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>

        </div>
        <div class='modal-body' style = 'height: 500px;  background-image:url(bground.jpg);  background-repeat: no-repeat; ' >

        </div>

        <div class='modal-footer'>
        <!--<a class="btn btn-default" data-dismiss="modal">Close</a>-->
        </div>
    </div>
</div>

评估为type Point{T} x::T y::T end P = Point(1., 2.) D = [P => 42] haskey(D, P)

如果使用相同的对象,它会起作用,但如果使用具有相同字段值的2个对象,则它不起作用。请注意,使用true定义的对象是可变的,因此即使您使用type作为键,您仍然可以在不知道字典的情况下更改其字段的值。字典需要对无法更改的内容进行哈希处理,例如类型对象的标识,而不是当前的字段值。由于元组是不可变的,因此它们的值可以安全地用作键。你也可以使用

Point

答案 1 :(得分:3)

如果您为hash定义自定义Point方法,那么事情就会按预期运作。