14
votes

Using Julia, I'd like to reliably convert any type into type String. There seems to be two ways to do the conversion in v0.5, either the string function or String constructor. The problem is that you need to choose the right one depending upon the input type.

For example, typeof(string(1)) evaluates to String, but String(1) throws an error. On the other hand, typeof(string(SubString{String}("a"))) evaluates to Substring{String}, which is not a subtype of String. We instead need to do String(SubString{String}("a")).

So it seems the only reliable way to convert any input x to type String is via the construct:

String(string(x))

which feels a bit cumbersome.

Am I missing something here?

1
Why do you need a String at the exclusion of all other AbstractStrings? Ideally you shouldn't need to care about the exact string type. - mbauman
@MattB. No good reason now that you've pointed out that I should be using AbstractString in my type definitions... :-) For the sake of completeness, does this mean that the String(string(x)) is the most reliable way of getting a String type? - Colin T Bowers
For a reference: now string(::SubString) returns a String. - Bogumił Kamiński

1 Answers

6
votes

You should rarely need to explicitly convert to String. Note that even if your type definitions have String fields, or if your arrays have concrete element type String, you can still rely on implicit conversion.

For instance, here are examples of implicit conversion:

type TestType
    field::String
end

obj = TestType(split("x y")[1])  # construct TestType with a SubString
obj.field  # the String "x"

obj.field = SubString("Hello", 1, 3)  # assign a SubString
obj.field  # the String "Hel"