Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Add Ukrainian translation of arrays (collections-2.13)#2502

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to ourterms of service andprivacy statement. We’ll occasionally send you account related emails.

Already on GitHub?Sign in to your account

Open
mbvyn wants to merge8 commits intoscala:main
base:main
Choose a base branch
Loading
frommbvyn:main

Conversation

@mbvyn
Copy link

No description provided.

next-page:strings

languages:[ru]
languages:[uk,ru]

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others.Learn more.

Why  uk and notukr?

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others.Learn more.

There's only ISO 639-1 code used, so we are also using it.

languages:uk
---

[Масиви](https://www.scala-lang.org/api/{{ site.scala-version }}/scala/Array.html) є спеціальним типом колекцій в Scala. З однієї сторони, Scala масиви один в один відповідають масивам в Java. Наприклад, Scala масив `Array[Int]` представлений в Java, як `int[]`, а `Array[Double]` в Java виглядатиме, як`double[]` і `Array[String]` відповідатиме Java `String[]`. Але з іншої сторони, Scala масиви пропонують набагато більше, ніж Java аналоги. По-перше, Scala масиви можуть бути _узагальнені_. Наприклад ви можете мати `Array[T]`, де `T` - це параметр типу або ж абстрактний тип. По-друге, Scala масиви сумісні з Scala послідовностями (`Seq`), тобто ви можете передати на вхід `Array[T]` де вимагається `Seq[T]`. Врешті-решт, Scala масиви також підтримують усі операції, які можна зробити з послідовностями (`Seq`). Ось приклад цього на ділі:

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others.Learn more.

якdouble[]

Пропущено пробіл

масиви сумісні з Scala

Милозвучніше буде написати "сумісні зі Scala"

mbvyn reacted with thumbs up emoji
scala> a3.reverse
res0: Array[Int] = Array(9, 3)

Враховуючи те, що Scala масиви представленні, так само як в Java, яким чином ці додаткові можливості підтримуються в Scala? Реалізація Scala масивів систематично використовує неявні перетворення. В Scala, масив не пробує_вдавати_ послідовність. Насправді він і не може, тому що тип даних представлений у чистому масиві не є підтипом`Seq`. Замість цього відбувається неявне "обгортання", перетворення між масивами та екземпляром класу`scala.collection.mutable.ArraySeq`, який у свою чергу є підтипом`Seq`. Ось, як це працює:

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others.Learn more.

масиви представленні

масиви представлені

масив не пробує

"не намагається" здається краще звучить, імхо

mbvyn reacted with thumbs up emoji
scala> a1 eq a4
res1: Boolean = false

Приклад вище показує, що масиви сумісні з послідовностями, тому що відбувається неявне перетворення з масивів в`ArraySeq`. Щоб зробити зворотнє перетворення, з`ArraySeq` в`Array`, ви можете використати`toArray` метод, який визначений в`Iterable`. Останній REPL рядок вище показує, що обгортання, а потім розгортання за допомогою`toArray` створює копію оригінального масиву.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others.Learn more.

рядок вище показує

Я б замінив на "рядок вище демонструє", щоб не повторювати те саме висказування з початку абзацу де вже вживалося "Приклад вище показує"

mbvyn reacted with thumbs up emoji

Приклад вище показує, що масиви сумісні з послідовностями, тому що відбувається неявне перетворення з масивів в`ArraySeq`. Щоб зробити зворотнє перетворення, з`ArraySeq` в`Array`, ви можете використати`toArray` метод, який визначений в`Iterable`. Останній REPL рядок вище показує, що обгортання, а потім розгортання за допомогою`toArray` створює копію оригінального масиву.

Існує інше неявне перетворення, яке застосовується до масивів. Це перетворення просто "додає" усі методи послідовностей до масивів, але не перетворює самі масиви в послідовності. "Додання" означає, що масив є обгорнутий в інший об'єкт типу`ArrayOps`, який підтримує усі методи послідовностей. Зазвичай, цей`ArrayOps` об'єкт є недовговічний; він, як правило, буде недоступним після виклику метода послідовності і його зберігання може бути утилізоване. Новітні віртуальні машини часто уникають створення цього об'єкта повністю.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others.Learn more.

< Існує інше

"Icнує й інше"
Також краще звучить

mbvyn reacted with thumbs up emoji

Ви можете побачити, що виклик метода`reverse` на`seq`, який має тип`ArraySeq`, знову верне тип`ArraySeq`. Це логічно, тому що`ArraySeq` є`Seq`, і виклик метода`reverse` на інших`Seq` знову вертатиме`Seq`. З іншої сторони, виклик`reverse` на об'єкті класу`ArrayOps` верне тип`Array`, а не`Seq`.

Приклад`ArrayOps` вище був дещо штучний, лише для того, щоб показати різницю`ArraySeq`. Зазвичай ви ніколи не будете визначати об'єкт класу`ArrayOps`. Ви будете просто викликати`Seq` метод на масиві:
Copy link

@VladKopanevVladKopanevAug 22, 2022
edited
Loading

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others.Learn more.

різницюArraySeq

"різницю зArraySeq"

визначати об'єкт класуArrayOps

"створювати самі об'єкт класуArrayOps"

mbvyn reacted with thumbs up emoji
scala> intArrayOps(a1).reverse
res5: Array[Int] = Array(3, 2, 1)

де `intArrayOps` є неявним перетворенням, що було вставлене напередодні. Це викликає питання, як компілятор вибрав `intArrayOps` серед інших неявних перетворень `ArraySeq` в рядку вище. Зрештою, обидва перетворення змінять масив в тип підтримуючий метод `reverse`, що й вказано у вхідних даних. Відповідь на це питання полягає в тому, що два неявних перетворення мають пріоритет. Перетворення `ArrayOps` має більший пріорітет, ніж `ArraySeq`. Перший визначений в `Predef` об'єкті, а другий в класі `scala.LowPriorityImplicits`, який наслідується `Predef`. Неявне перетворення в підкласах та підоб'єктах мають перевагу над неявним перетворенням в базовому класі. То ж, якщо обидва перетворення застосовані, вибирається, той що в `Predef`. Дуже схожий підхід використовується в рядках (`String`).

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others.Learn more.

що було вставлене напередодні

Краще "що було вставлене перед цим", для мене передодні чомусь звучить, як "учора"

scala> intArrayOps(a1).reverse
res5: Array[Int] = Array(3, 2, 1)

де `intArrayOps` є неявним перетворенням, що було вставлене перед цим. Це викликає питання, як компілятор вибрав `intArrayOps` серед інших неявних перетворень `ArraySeq` в рядку вище. Зрештою, обидва перетворення змінять масив в тип підтримуючий метод `reverse`, що й вказано у вхідних даних. Відповідь на це питання полягає в тому, що два неявних перетворення мають пріоритет. Перетворення `ArrayOps` має більший пріорітет, ніж `ArraySeq`. Перший визначений в `Predef` об'єкті, а другий в класі `scala.LowPriorityImplicits`, який наслідується `Predef`. Неявне перетворення в підкласах та підоб'єктах мають перевагу над неявним перетворенням в базовому класі. То ж, якщо обидва перетворення застосовані, вибирається, той що в `Predef`. Дуже схожий підхід використовується в рядках (`String`).
Copy link
Contributor

@kazanzhykazanzhyAug 23, 2022
edited
Loading

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others.Learn more.

Якось "...тип підтримуючий..." не звучить.
Може "тип, що підтриує" або "що реалізовує методreverse"?

mbvyn reacted with thumbs up emoji
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others.Learn more.

s/пріорітет/пріоритет

mbvyn reacted with thumbs up emoji
arr
}

Метод `evenElems` повертає новий масив який складається з усіх елементів аргумента вектора `xs` які знаходяться на парних позиціях у векторі. Перший рядок тіла метода `evenElems` створює новий масив результатів, який має той самий тип елемента, що й аргумент. Отже, залежно від фактичного параметра типу `T`, це може бути `Array[Int]`, або `Array[Boolean]`, або масив інших примітивних типів в Java, або ж масив певного посилального типу. Але всі ці типи мають різне представлення під час виконання, тож як середовище виконання Scala вибере правильне? Насправді воно не може цього зробити на основі наданої інформації, оскільки фактичний тип, який відповідає параметру типу `T` стирається під час виконання. Ось чому ви отримаєте таке повідомлення про помилку, якщо скомпілюєте наведений вище код:
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others.Learn more.

s/аргумента/аргументу

mbvyn reacted with thumbs up emoji
val arr = new Array[T]((arr.length + 1) / 2)
^

Тут потрібно, щоб ви допомогли компілятору, надавши деяку підказку під час виконання, яким є фактичний параметр типу`evenElems`. Ця підказка під час виконання має форму маніфесту типу класу`scala.reflect.ClassTag`. Маніфест класу - це об'єкт дескриптор типа, що описує, який тип у класа верхнього рівня. Як альтернатива маніфестам класу існують також повні маніфести типу`scala.reflect.Manifest`, які описують усі аспекти типу. Але для створення масиву потрібні лише маніфести класу.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others.Learn more.

s/класа/класу

mbvyn reacted with thumbs up emoji
mbvynand others added3 commitsSeptember 11, 2022 15:14
Co-authored-by: Dmytro Kazanzhy <dkazanzhy@gmail.com>
# Conflicts:#_uk/overviews/collections-2.13/arrays.md
Sign up for freeto join this conversation on GitHub. Already have an account?Sign in to comment

Reviewers

3 more reviewers

@kazanzhykazanzhykazanzhy approved these changes

@andriibutkoandriibutkoandriibutko left review comments

@VladKopanevVladKopanevVladKopanev approved these changes

Reviewers whose approvals may not affect merge requirements

Assignees

No one assigned

Labels

None yet

Projects

None yet

Milestone

No milestone

Development

Successfully merging this pull request may close these issues.

4 participants

@mbvyn@VladKopanev@kazanzhy@andriibutko

[8]ページ先頭

©2009-2025 Movatter.jp