On Thursday, March 12, 2015 at 9:00:45 PM UTC-7, Avik Sengupta wrote:
>
> I think this is simply due to your passing a UTF8String, while your
> function defined only for ASCIIString. Since there is no function defined
> for UTF8String, julia falls back to the default constructor that calls
> convert.
>
> julia> type A
> a::ASCIIString
> b::Int
> end
>
> julia> function A(fn::ASCIIString)
> A(fn, length(fn)
> end
> ERROR: syntax: missing comma or ) in argument list
>
> julia> function A(fn::ASCIIString)
> A(fn, length(fn))
> end
> A
>
> julia> A("X")
> A("X",1)
>
> julia> A("∞")
> ERROR: MethodError: `convert` has no method matching convert(::Type{A},
> ::UTF8String)
> This may have arisen from a call to the constructor A(...),
> since type constructors fall back to convert methods.
> Closest candidates are:
> convert{T}(::Type{T}, ::T)
>
> in call at no file
>
>
> #Now try this:
>
> julia> type A
> a::AbstractString
> b::Int
> end
>
> julia> function A(fn::AbstractString)
> A(fn, length(fn))
> end
> A
>
> julia> A("X")
> A("X",1)
>
> julia> A("∞")
> A("∞",1)
>
> Not that using AbstractString is only one way to solve this, which may or
> may not be appropriate for your use case. The code above is simply to
> demonstrate the issue at hand.
>
>
Why would this have changed in 0.4, though?
Running in Julia 0.4:
julia> typeof("string")
ASCIIString
so a quoted string still has the same type as it did before.
>
>
> On Thursday, 12 March 2015 23:43:58 UTC, Phil Tomson wrote:
>>
>> I thought I'd give 0.4 a spin to try out the new garbage collector.
>>
>> On my current codebase developed with 0.3 I ran into several warnings
>> (*float32()
>> should now be Float32()* - that sort of thing)
>>
>> And then this error:
>>
>>
>>
>>
>>
>>
>> *ERROR: LoadError: LoadError: LoadError: LoadError: LoadError:
>> MethodError: `convert` has no method matching convert(::Type{Img.ImgHSV},
>> ::UTF8String)This may have arisen from a call to the constructor
>> Img.ImgHSV(...),since type constructors fall back to convert
>> methods.Closest candidates are: convert{T}(::Type{T}, ::T)*
>> After poking around New Language Features and the list here a bit it
>> seems that there are changes to how overloaded constructors work.
>>
>> In my case I've got:
>>
>> type ImgHSV
>> name::ASCIIString
>> data::Array{HSV{Float32},2}
>> #data::Array{IntHSV,2}
>> height::Int64
>> wid::Int64
>> h_mean::Float32
>> s_mean::Float32
>> v_mean::Float32
>> h_std::Float32
>> s_std::Float32
>> v_std::Float32
>> end
>>
>> # Given a filename of an image file, construct an ImgHSV
>> function ImgHSV(fn::ASCIIString)
>> name,ext = splitext(basename(fn))
>> source_img_hsv = Images.data(convert(Image{HSV{Float64}},imread(fn)))
>> #scale all the values up from (0->1) to (0->255)
>> source_img_scaled = map(x-> HSV( ((x.h/360)*255),(x.s*255),(x.v*255)),
>> source_img_hsv)
>> img_ht = size(source_img_hsv,2)
>> img_wid = size(source_img_hsv,1)
>> h_mean = (mean(map(x-> x.h,source_img_hsv)/360)*255)
>> s_mean = (mean(map(x-> x.s,source_img_hsv))*255)
>> v_mean = (mean(map(x-> x.v,source_img_hsv))*255)
>> h_std = (std(map(x-> x.h,source_img_hsv)/360)*255)
>> s_std = (std(map(x-> x.s,source_img_hsv))*255)
>> v_std = (std(map(x-> x.v,source_img_hsv))*255)
>> ImgHSV(
>> name,
>> float32(source_img_scaled),
>> img_ht,
>> img_wid,
>> h_mean,
>> s_mean,
>> v_mean,
>> h_std,
>> s_std,
>> v_std
>> )
>> end
>>
>> Should I rename this function to something like buildImgHSV so it's not
>> actually a constructor and *convert* doesn't enter the picture?
>>
>> Phil
>>
>>