ThunderHorn
ThunderHorn

Reputation: 2035

Kotlin: Pass ranges in function as arguments

Hello is it possible to pass range in Kotlin function just like in python? I've just started learning Kotlin but I am a little bit stuck

I wish i could pass somethind like

my_gauge = Gauge('test_name',1..200, 201..300, and etc.)

for example I have a Gauge object which rotates on the base

class Gauge(val gauge_name: String,
            val red_value: Float, 
            val orange_value: Float,
            val yellow_value: Float,
            val green_value: Float,
            var current_value: Float,
            val min_value: Float,
            val max_value: Float) {

    val gauge_green = 0xFF66C2A5.toInt()
    val gauge_yellow = 0xFFFDD448.toInt()
    val gauge_orange = 0xFFF5A947.toInt()
    val gauge_red = 0xFFD53E4F.toInt()

    val min_rotation: Int = 0;
    val max_rotation: Int = 300;
    val ratio = max_rotation / max_value;

    fun calculate_rotation(): Int {
        return (current_value * ratio).toInt()
    }

    fun get_color(): Int {
        if (current_value >= red_value) {
            return gauge_red
        }
        if (current_value > orange_value) {
            return gauge_orange
        }

        if (current_value > yellow_value) {
            return gauge_yellow
        }

        return gauge_green
    }


}

I've just realized that it wont work with this data instead it will be better to build my logic around ranges

So my question is How to pass ranges as a param in class/function (instead of floats)

PS: The function get_colors is not correct I will fix it once I can pass ranges with when(current_value) statement

Upvotes: 4

Views: 2273

Answers (2)

Rupesh Kumar
Rupesh Kumar

Reputation: 53

Try this in simple way, you can use range according to data type IntRange, FloatRange, LongRange etc.

fun foo(range: IntRange){
    for (a in range){
        println(a)
    }
}

// call this function by foo(1..10)

Upvotes: 5

Tenfour04
Tenfour04

Reputation: 93581

Yes, the type of a range produced by .. is ClosedRange<T>:

fun foo(floatRange: ClosedRange<Float>) {
    println(floatRange.random())
}

// Usage:
foo(1f..10f)

For integer ranges, you may prefer IntRange over ClosedRange<Int> because it allows you to use it without the performance cost of boxing by using first and last instead of start and endInclusive. There is no unboxed version for other number types.

Upvotes: 8

Related Questions