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
>>
>>

Reply via email to