|
@@ -57,13 +57,13 @@
|
|
|
extends Node
|
|
|
|
|
|
class Stats:
|
|
|
- pass
|
|
|
+ pass
|
|
|
|
|
|
func _ready():
|
|
|
- var a = Array([], TYPE_INT, "", null) # Array[int]
|
|
|
- var b = Array([], TYPE_OBJECT, "Node", null) # Array[Node]
|
|
|
- var c = Array([], TYPE_OBJECT, "Node", Sword) # Array[Sword]
|
|
|
- var d = Array([], TYPE_OBJECT, "RefCounted", Stats) # Array[Stats]
|
|
|
+ var a = Array([], TYPE_INT, "", null) # Array[int]
|
|
|
+ var b = Array([], TYPE_OBJECT, "Node", null) # Array[Node]
|
|
|
+ var c = Array([], TYPE_OBJECT, "Node", Sword) # Array[Sword]
|
|
|
+ var d = Array([], TYPE_OBJECT, "RefCounted", Stats) # Array[Stats]
|
|
|
[/codeblock]
|
|
|
The [param base] array's elements are converted when necessary. If this is not possible or [param base] is already typed, this constructor fails and returns an empty [Array].
|
|
|
In GDScript, this constructor is usually not necessary, as it is possible to create a typed array through static typing:
|
|
@@ -164,36 +164,36 @@
|
|
|
[codeblocks]
|
|
|
[gdscript]
|
|
|
func greater_than_5(number):
|
|
|
- return number > 5
|
|
|
+ return number > 5
|
|
|
|
|
|
func _ready():
|
|
|
- print([6, 10, 6].all(greater_than_5)) # Prints true (3/3 elements evaluate to true).
|
|
|
- print([4, 10, 4].all(greater_than_5)) # Prints false (1/3 elements evaluate to true).
|
|
|
- print([4, 4, 4].all(greater_than_5)) # Prints false (0/3 elements evaluate to true).
|
|
|
- print([].all(greater_than_5)) # Prints true (0/0 elements evaluate to true).
|
|
|
+ print([6, 10, 6].all(greater_than_5)) # Prints true (3/3 elements evaluate to true).
|
|
|
+ print([4, 10, 4].all(greater_than_5)) # Prints false (1/3 elements evaluate to true).
|
|
|
+ print([4, 4, 4].all(greater_than_5)) # Prints false (0/3 elements evaluate to true).
|
|
|
+ print([].all(greater_than_5)) # Prints true (0/0 elements evaluate to true).
|
|
|
|
|
|
- # Same as the first line above, but using a lambda function.
|
|
|
- print([6, 10, 6].all(func(element): return element > 5)) # Prints true
|
|
|
+ # Same as the first line above, but using a lambda function.
|
|
|
+ print([6, 10, 6].all(func(element): return element > 5)) # Prints true
|
|
|
[/gdscript]
|
|
|
[csharp]
|
|
|
private static bool GreaterThan5(int number)
|
|
|
{
|
|
|
- return number > 5;
|
|
|
+ return number > 5;
|
|
|
}
|
|
|
|
|
|
public override void _Ready()
|
|
|
{
|
|
|
- // Prints True (3/3 elements evaluate to true).
|
|
|
- GD.Print(new Godot.Collections.Array>int< { 6, 10, 6 }.All(GreaterThan5));
|
|
|
- // Prints False (1/3 elements evaluate to true).
|
|
|
- GD.Print(new Godot.Collections.Array>int< { 4, 10, 4 }.All(GreaterThan5));
|
|
|
- // Prints False (0/3 elements evaluate to true).
|
|
|
- GD.Print(new Godot.Collections.Array>int< { 4, 4, 4 }.All(GreaterThan5));
|
|
|
- // Prints True (0/0 elements evaluate to true).
|
|
|
- GD.Print(new Godot.Collections.Array>int< { }.All(GreaterThan5));
|
|
|
+ // Prints True (3/3 elements evaluate to true).
|
|
|
+ GD.Print(new Godot.Collections.Array>int< { 6, 10, 6 }.All(GreaterThan5));
|
|
|
+ // Prints False (1/3 elements evaluate to true).
|
|
|
+ GD.Print(new Godot.Collections.Array>int< { 4, 10, 4 }.All(GreaterThan5));
|
|
|
+ // Prints False (0/3 elements evaluate to true).
|
|
|
+ GD.Print(new Godot.Collections.Array>int< { 4, 4, 4 }.All(GreaterThan5));
|
|
|
+ // Prints True (0/0 elements evaluate to true).
|
|
|
+ GD.Print(new Godot.Collections.Array>int< { }.All(GreaterThan5));
|
|
|
|
|
|
- // Same as the first line above, but using a lambda function.
|
|
|
- GD.Print(new Godot.Collections.Array>int< { 6, 10, 6 }.All(element => element > 5)); // Prints True
|
|
|
+ // Same as the first line above, but using a lambda function.
|
|
|
+ GD.Print(new Godot.Collections.Array>int< { 6, 10, 6 }.All(element => element > 5)); // Prints True
|
|
|
}
|
|
|
[/csharp]
|
|
|
[/codeblocks]
|
|
@@ -210,16 +210,16 @@
|
|
|
The [param method] should take one [Variant] parameter (the current array element) and return a [bool].
|
|
|
[codeblock]
|
|
|
func greater_than_5(number):
|
|
|
- return number > 5
|
|
|
+ return number > 5
|
|
|
|
|
|
func _ready():
|
|
|
- print([6, 10, 6].any(greater_than_5)) # Prints true (3 elements evaluate to true).
|
|
|
- print([4, 10, 4].any(greater_than_5)) # Prints true (1 elements evaluate to true).
|
|
|
- print([4, 4, 4].any(greater_than_5)) # Prints false (0 elements evaluate to true).
|
|
|
- print([].any(greater_than_5)) # Prints false (0 elements evaluate to true).
|
|
|
+ print([6, 10, 6].any(greater_than_5)) # Prints true (3 elements evaluate to true).
|
|
|
+ print([4, 10, 4].any(greater_than_5)) # Prints true (1 elements evaluate to true).
|
|
|
+ print([4, 4, 4].any(greater_than_5)) # Prints false (0 elements evaluate to true).
|
|
|
+ print([].any(greater_than_5)) # Prints false (0 elements evaluate to true).
|
|
|
|
|
|
- # Same as the first line above, but using a lambda function.
|
|
|
- print([6, 10, 6].any(func(number): return number > 5)) # Prints true
|
|
|
+ # Same as the first line above, but using a lambda function.
|
|
|
+ print([6, 10, 6].any(func(number): return number > 5)) # Prints true
|
|
|
[/codeblock]
|
|
|
See also [method all], [method filter], [method map] and [method reduce].
|
|
|
[b]Note:[/b] Unlike relying on the size of an array returned by [method filter], this method will return as early as possible to improve performance (especially with large arrays).
|
|
@@ -292,23 +292,23 @@
|
|
|
If [param before] is [code]true[/code] (as by default), the returned index comes before all existing elements equal to [param value] in the array.
|
|
|
[codeblock]
|
|
|
func sort_by_amount(a, b):
|
|
|
- if a[1] < b[1]:
|
|
|
- return true
|
|
|
- return false
|
|
|
+ if a[1] < b[1]:
|
|
|
+ return true
|
|
|
+ return false
|
|
|
|
|
|
func _ready():
|
|
|
- var my_items = [["Tomato", 2], ["Kiwi", 5], ["Rice", 9]]
|
|
|
+ var my_items = [["Tomato", 2], ["Kiwi", 5], ["Rice", 9]]
|
|
|
|
|
|
- var apple = ["Apple", 5]
|
|
|
- # "Apple" is inserted before "Kiwi".
|
|
|
- my_items.insert(my_items.bsearch_custom(apple, sort_by_amount, true), apple)
|
|
|
+ var apple = ["Apple", 5]
|
|
|
+ # "Apple" is inserted before "Kiwi".
|
|
|
+ my_items.insert(my_items.bsearch_custom(apple, sort_by_amount, true), apple)
|
|
|
|
|
|
- var banana = ["Banana", 5]
|
|
|
- # "Banana" is inserted after "Kiwi".
|
|
|
- my_items.insert(my_items.bsearch_custom(banana, sort_by_amount, false), banana)
|
|
|
+ var banana = ["Banana", 5]
|
|
|
+ # "Banana" is inserted after "Kiwi".
|
|
|
+ my_items.insert(my_items.bsearch_custom(banana, sort_by_amount, false), banana)
|
|
|
|
|
|
- # Prints [["Tomato", 2], ["Apple", 5], ["Kiwi", 5], ["Banana", 5], ["Rice", 9]]
|
|
|
- print(my_items)
|
|
|
+ # Prints [["Tomato", 2], ["Apple", 5], ["Kiwi", 5], ["Banana", 5], ["Rice", 9]]
|
|
|
+ print(my_items)
|
|
|
[/codeblock]
|
|
|
[b]Note:[/b] Calling [method bsearch_custom] on an [i]unsorted[/i] array will result in unexpected behavior. Use [method sort_custom] with [param func] before calling this method.
|
|
|
</description>
|
|
@@ -384,13 +384,13 @@
|
|
|
The [param method] receives one of the array elements as an argument, and should return [code]true[/code] to add the element to the filtered array, or [code]false[/code] to exclude it.
|
|
|
[codeblock]
|
|
|
func is_even(number):
|
|
|
- return number % 2 == 0
|
|
|
+ return number % 2 == 0
|
|
|
|
|
|
func _ready():
|
|
|
- print([1, 4, 5, 8].filter(is_even)) # Prints [4, 8]
|
|
|
+ print([1, 4, 5, 8].filter(is_even)) # Prints [4, 8]
|
|
|
|
|
|
- # Same as above, but using a lambda function.
|
|
|
- print([1, 4, 5, 8].filter(func(number): return number % 2 == 0))
|
|
|
+ # Same as above, but using a lambda function.
|
|
|
+ print([1, 4, 5, 8].filter(func(number): return number % 2 == 0))
|
|
|
[/codeblock]
|
|
|
See also [method any], [method all], [method map] and [method reduce].
|
|
|
</description>
|
|
@@ -416,10 +416,10 @@
|
|
|
[codeblocks]
|
|
|
[gdscript]
|
|
|
func is_even(number):
|
|
|
- return number % 2 == 0
|
|
|
+ return number % 2 == 0
|
|
|
|
|
|
func _ready():
|
|
|
- print([1, 3, 4, 7].find_custom(is_even.bind())) # Prints 2
|
|
|
+ print([1, 3, 4, 7].find_custom(is_even.bind())) # Prints 2
|
|
|
[/gdscript]
|
|
|
[/codeblocks]
|
|
|
</description>
|
|
@@ -481,7 +481,7 @@
|
|
|
In GDScript, this is equivalent to the [code]in[/code] operator:
|
|
|
[codeblock]
|
|
|
if 4 in [2, 4, 6, 8]:
|
|
|
- print("4 is here!") # Will be printed.
|
|
|
+ print("4 is here!") # Will be printed.
|
|
|
[/codeblock]
|
|
|
[b]Note:[/b] For performance reasons, the search is affected by the [param value]'s [enum Variant.Type]. For example, [code]7[/code] ([int]) and [code]7.0[/code] ([float]) are not considered equal for this method.
|
|
|
</description>
|
|
@@ -549,13 +549,13 @@
|
|
|
The [param method] should take one [Variant] parameter (the current array element) and can return any [Variant].
|
|
|
[codeblock]
|
|
|
func double(number):
|
|
|
- return number * 2
|
|
|
+ return number * 2
|
|
|
|
|
|
func _ready():
|
|
|
- print([1, 2, 3].map(double)) # Prints [2, 4, 6]
|
|
|
+ print([1, 2, 3].map(double)) # Prints [2, 4, 6]
|
|
|
|
|
|
- # Same as above, but using a lambda function.
|
|
|
- print([1, 2, 3].map(func(element): return element * 2))
|
|
|
+ # Same as above, but using a lambda function.
|
|
|
+ print([1, 2, 3].map(func(element): return element * 2))
|
|
|
[/codeblock]
|
|
|
See also [method filter], [method reduce], [method any] and [method all].
|
|
|
</description>
|
|
@@ -635,36 +635,36 @@
|
|
|
The [param method] takes two arguments: the current value of [param accum] and the current array element. If [param accum] is [code]null[/code] (as by default), the iteration will start from the second element, with the first one used as initial value of [param accum].
|
|
|
[codeblock]
|
|
|
func sum(accum, number):
|
|
|
- return accum + number
|
|
|
+ return accum + number
|
|
|
|
|
|
func _ready():
|
|
|
- print([1, 2, 3].reduce(sum, 0)) # Prints 6
|
|
|
- print([1, 2, 3].reduce(sum, 10)) # Prints 16
|
|
|
+ print([1, 2, 3].reduce(sum, 0)) # Prints 6
|
|
|
+ print([1, 2, 3].reduce(sum, 10)) # Prints 16
|
|
|
|
|
|
- # Same as above, but using a lambda function.
|
|
|
- print([1, 2, 3].reduce(func(accum, number): return accum + number, 10))
|
|
|
+ # Same as above, but using a lambda function.
|
|
|
+ print([1, 2, 3].reduce(func(accum, number): return accum + number, 10))
|
|
|
[/codeblock]
|
|
|
If [method max] is not desirable, this method may also be used to implement a custom comparator:
|
|
|
[codeblock]
|
|
|
func _ready():
|
|
|
- var arr = [Vector2i(5, 0), Vector2i(3, 4), Vector2i(1, 2)]
|
|
|
+ var arr = [Vector2i(5, 0), Vector2i(3, 4), Vector2i(1, 2)]
|
|
|
|
|
|
- var longest_vec = arr.reduce(func(max, vec): return vec if is_length_greater(vec, max) else max)
|
|
|
- print(longest_vec) # Prints (3, 4)
|
|
|
+ var longest_vec = arr.reduce(func(max, vec): return vec if is_length_greater(vec, max) else max)
|
|
|
+ print(longest_vec) # Prints (3, 4)
|
|
|
|
|
|
func is_length_greater(a, b):
|
|
|
- return a.length() > b.length()
|
|
|
+ return a.length() > b.length()
|
|
|
[/codeblock]
|
|
|
This method can also be used to count how many elements in an array satisfy a certain condition, similar to [method count]:
|
|
|
[codeblock]
|
|
|
func is_even(number):
|
|
|
- return number % 2 == 0
|
|
|
+ return number % 2 == 0
|
|
|
|
|
|
func _ready():
|
|
|
- var arr = [1, 2, 3, 4, 5]
|
|
|
- # If the current element is even, increment count, otherwise leave count the same.
|
|
|
- var even_count = arr.reduce(func(count, next): return count + 1 if is_even(next) else count, 0)
|
|
|
- print(even_count) # Prints 2
|
|
|
+ var arr = [1, 2, 3, 4, 5]
|
|
|
+ # If the current element is even, increment count, otherwise leave count the same.
|
|
|
+ var even_count = arr.reduce(func(count, next): return count + 1 if is_even(next) else count, 0)
|
|
|
+ print(even_count) # Prints 2
|
|
|
[/codeblock]
|
|
|
See also [method map], [method filter], [method any], and [method all].
|
|
|
</description>
|
|
@@ -781,18 +781,18 @@
|
|
|
[param func] is called as many times as necessary, receiving two array elements as arguments. The function should return [code]true[/code] if the first element should be moved [i]before[/i] the second one, otherwise it should return [code]false[/code].
|
|
|
[codeblock]
|
|
|
func sort_ascending(a, b):
|
|
|
- if a[1] < b[1]:
|
|
|
- return true
|
|
|
- return false
|
|
|
+ if a[1] < b[1]:
|
|
|
+ return true
|
|
|
+ return false
|
|
|
|
|
|
func _ready():
|
|
|
- var my_items = [["Tomato", 5], ["Apple", 9], ["Rice", 4]]
|
|
|
- my_items.sort_custom(sort_ascending)
|
|
|
- print(my_items) # Prints [["Rice", 4], ["Tomato", 5], ["Apple", 9]]
|
|
|
+ var my_items = [["Tomato", 5], ["Apple", 9], ["Rice", 4]]
|
|
|
+ my_items.sort_custom(sort_ascending)
|
|
|
+ print(my_items) # Prints [["Rice", 4], ["Tomato", 5], ["Apple", 9]]
|
|
|
|
|
|
- # Sort descending, using a lambda function.
|
|
|
- my_items.sort_custom(func(a, b): return a[1] > b[1])
|
|
|
- print(my_items) # Prints [["Apple", 9], ["Tomato", 5], ["Rice", 4]]
|
|
|
+ # Sort descending, using a lambda function.
|
|
|
+ my_items.sort_custom(func(a, b): return a[1] > b[1])
|
|
|
+ print(my_items) # Prints [["Apple", 9], ["Tomato", 5], ["Rice", 4]]
|
|
|
[/codeblock]
|
|
|
It may also be necessary to use this method to sort strings by natural order, with [method String.naturalnocasecmp_to], as in the following example:
|
|
|
[codeblock]
|