mirror of
https://github.com/msfjarvis/msfjarvis.dev.git
synced 2024-06-03 04:18:56 +05:30
Revert "Use Hugo highlighting"
This isn't needed to actually use Hugo highlighting, the fenced code blocks are automatically interpreted and
rendered at build-time.
This reverts commit 7e7477fdd3
.
This commit is contained in:
parent
b733183417
commit
475ddde003
|
@ -25,7 +25,7 @@ The first part of this endeavour involved finding a new way to move static asset
|
||||||
|
|
||||||
To handle my two-sites-from-one-repo usecase, I setup a build staging -> publish staging -> build prod -> publish prod pipeline.
|
To handle my two-sites-from-one-repo usecase, I setup a build staging -> publish staging -> build prod -> publish prod pipeline.
|
||||||
|
|
||||||
{{< highlight yaml >}}
|
```yaml
|
||||||
- name: Build staging
|
- name: Build staging
|
||||||
run: hugo --minify -DEFb=https://staging.msfjarvis.dev
|
run: hugo --minify -DEFb=https://staging.msfjarvis.dev
|
||||||
|
|
||||||
|
@ -49,7 +49,7 @@ To handle my two-sites-from-one-repo usecase, I setup a build staging -> publish
|
||||||
SERVER_ADDRESS: ${{ secrets.SERVER_ADDRESS }}
|
SERVER_ADDRESS: ${{ secrets.SERVER_ADDRESS }}
|
||||||
SERVER_DESTINATION: ${{ secrets.SERVER_DESTINATION_PROD }}
|
SERVER_DESTINATION: ${{ secrets.SERVER_DESTINATION_PROD }}
|
||||||
SSH_PORT: ${{ secrets.SSH_PORT }}
|
SSH_PORT: ${{ secrets.SSH_PORT }}
|
||||||
{{< / highlight >}}
|
```
|
||||||
|
|
||||||
You can find the `ci/deploy.sh` script [here](https://github.com/msfjarvis/msfjarvis.dev/blob/src/ci/deploy.sh). It's a very basic script that sets up the SSH authentication and rsync's the built site over.
|
You can find the `ci/deploy.sh` script [here](https://github.com/msfjarvis/msfjarvis.dev/blob/src/ci/deploy.sh). It's a very basic script that sets up the SSH authentication and rsync's the built site over.
|
||||||
|
|
||||||
|
|
|
@ -20,7 +20,7 @@ NB: Grab a Personal Access Token from GitHub with the `write:packages` scope. Yo
|
||||||
|
|
||||||
Copy the official integration step from GitHub's [guide](https://help.github.com/en/github/managing-packages-with-github-packages/configuring-gradle-for-use-with-github-packages#authenticating-with-a-personal-access-token), into your Android library's `build.gradle` / `build.gradle.kts`. If you try to run `./gradlew publish` now, you'll run into errors. We'll be fixing that shortly. \[[Commit link](https://github.com/msfjarvis/github-packages-deployment-sample/commit/d69235577a1d4345cecb364a3a3d366bf894c5a6)\]
|
Copy the official integration step from GitHub's [guide](https://help.github.com/en/github/managing-packages-with-github-packages/configuring-gradle-for-use-with-github-packages#authenticating-with-a-personal-access-token), into your Android library's `build.gradle` / `build.gradle.kts`. If you try to run `./gradlew publish` now, you'll run into errors. We'll be fixing that shortly. \[[Commit link](https://github.com/msfjarvis/github-packages-deployment-sample/commit/d69235577a1d4345cecb364a3a3d366bf894c5a6)\]
|
||||||
|
|
||||||
{{< highlight diff >}}
|
```diff
|
||||||
--- library/build.gradle
|
--- library/build.gradle
|
||||||
+++ library/build.gradle
|
+++ library/build.gradle
|
||||||
@@ -1,5 +1,6 @@
|
@@ -1,5 +1,6 @@
|
||||||
|
@ -55,13 +55,13 @@ Copy the official integration step from GitHub's [guide](https://help.github.com
|
||||||
dependencies {
|
dependencies {
|
||||||
api deps.support.app_compat
|
api deps.support.app_compat
|
||||||
implementation deps.kotlin.stdlib8
|
implementation deps.kotlin.stdlib8
|
||||||
{{< / highlight >}}
|
```
|
||||||
|
|
||||||
#### Step 2
|
#### Step 2
|
||||||
|
|
||||||
Switch out the `maven-publish` plugin with [this](https://github.com/wupdigital/android-maven-publish) one. It provides us an Android component that's compatible with publications and precisely what we need. \[[Commit link](https://github.com/msfjarvis/github-packages-deployment-sample/commit/1452c4a0c15d394b73dc3384f02834788dfe1bda)\]
|
Switch out the `maven-publish` plugin with [this](https://github.com/wupdigital/android-maven-publish) one. It provides us an Android component that's compatible with publications and precisely what we need. \[[Commit link](https://github.com/msfjarvis/github-packages-deployment-sample/commit/1452c4a0c15d394b73dc3384f02834788dfe1bda)\]
|
||||||
|
|
||||||
{{< highlight diff >}}
|
```diff
|
||||||
--- build.gradle
|
--- build.gradle
|
||||||
+++ build.gradle
|
+++ build.gradle
|
||||||
@@ -14,6 +14,7 @@ buildscript {
|
@@ -14,6 +14,7 @@ buildscript {
|
||||||
|
@ -95,13 +95,13 @@ Switch out the `maven-publish` plugin with [this](https://github.com/wupdigital/
|
||||||
|
|
||||||
apply from: "../dependencies.gradle"
|
apply from: "../dependencies.gradle"
|
||||||
// apply from: "../bintrayconfig.gradle"
|
// apply from: "../bintrayconfig.gradle"
|
||||||
{{< / highlight >}}
|
```
|
||||||
|
|
||||||
#### Step 3
|
#### Step 3
|
||||||
|
|
||||||
Switch to using the `android` component provided by `wup.digital.android-maven-publish`. This is the one we require to be able to upload an [AAR](https://developer.android.com/studio/projects/android-library) artifact. \[[Commit link](https://github.com/msfjarvis/github-packages-deployment-sample/commit/7cc6fcd6ffa5774433bce76ac6929435dbbb77cc)\]
|
Switch to using the `android` component provided by `wup.digital.android-maven-publish`. This is the one we require to be able to upload an [AAR](https://developer.android.com/studio/projects/android-library) artifact. \[[Commit link](https://github.com/msfjarvis/github-packages-deployment-sample/commit/7cc6fcd6ffa5774433bce76ac6929435dbbb77cc)\]
|
||||||
|
|
||||||
{{< highlight diff >}}
|
```diff
|
||||||
--- library/build.gradle
|
--- library/build.gradle
|
||||||
+++ library/build.gradle
|
+++ library/build.gradle
|
||||||
@@ -42,7 +42,7 @@ publishing {
|
@@ -42,7 +42,7 @@ publishing {
|
||||||
|
@ -113,15 +113,15 @@ Switch to using the `android` component provided by `wup.digital.android-maven-p
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
{{< / highlight >}}
|
```
|
||||||
|
|
||||||
#### Step 4
|
#### Step 4
|
||||||
|
|
||||||
Every Gradle/Maven dependency's address has three attributes, a group ID, an artifact ID, and a version.
|
Every Gradle/Maven dependency's address has three attributes, a group ID, an artifact ID, and a version.
|
||||||
|
|
||||||
{{< highlight groovy >}}
|
```groovy
|
||||||
implementation 'com.example:my-fancy-library:1.0.0'
|
implementation 'com.example:my-fancy-library:1.0.0'
|
||||||
{{< / highlight >}}
|
```
|
||||||
|
|
||||||
Here:
|
Here:
|
||||||
|
|
||||||
|
@ -131,7 +131,7 @@ Here:
|
||||||
|
|
||||||
We'll need to configure these too. I prefer using the `gradle.properties` file for this purpose since it's very easy to access variables from it, but if you have a favorite way of configuring build properties, use that instead! \[[Commit link](https://github.com/msfjarvis/github-packages-deployment-sample/commit/cee74a5e0b3b76d1d7a2d4eb9636d80fb1db49d6)\]
|
We'll need to configure these too. I prefer using the `gradle.properties` file for this purpose since it's very easy to access variables from it, but if you have a favorite way of configuring build properties, use that instead! \[[Commit link](https://github.com/msfjarvis/github-packages-deployment-sample/commit/cee74a5e0b3b76d1d7a2d4eb9636d80fb1db49d6)\]
|
||||||
|
|
||||||
{{< highlight diff >}}
|
```diff
|
||||||
--- gradle.properties
|
--- gradle.properties
|
||||||
+++ gradle.properties
|
+++ gradle.properties
|
||||||
@@ -19,3 +19,7 @@ android.useAndroidX=true
|
@@ -19,3 +19,7 @@ android.useAndroidX=true
|
||||||
|
@ -156,7 +156,7 @@ We'll need to configure these too. I prefer using the `gradle.properties` file f
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
{{< / highlight >}}
|
```
|
||||||
|
|
||||||
#### Step 5
|
#### Step 5
|
||||||
|
|
||||||
|
@ -164,7 +164,7 @@ Now all that's left to do is configure GitHub Actions. Go to the Secrets menu in
|
||||||
|
|
||||||
Now, let's add the actual configuration that'll get Actions up and running.
|
Now, let's add the actual configuration that'll get Actions up and running.
|
||||||
|
|
||||||
{{< highlight diff >}}
|
```diff
|
||||||
--- /dev/null
|
--- /dev/null
|
||||||
+++ .github/workflows/publish_snapshot.yml
|
+++ .github/workflows/publish_snapshot.yml
|
||||||
@@ -0,0 +1,13 @@
|
@@ -0,0 +1,13 @@
|
||||||
|
@ -181,7 +181,7 @@ Now, let's add the actual configuration that'll get Actions up and running.
|
||||||
+ env:
|
+ env:
|
||||||
+ USERNAME: msfjarvis
|
+ USERNAME: msfjarvis
|
||||||
+ PASSWORD: ${{ secrets.PACKAGES_TOKEN }}
|
+ PASSWORD: ${{ secrets.PACKAGES_TOKEN }}
|
||||||
{{< / highlight >}}
|
```
|
||||||
|
|
||||||
That's it! Once you push to GitHub, you'll see the [action running](https://github.com/msfjarvis/github-packages-deployment-sample/commit/42e1f6609bf9f2abe8e181296a57d86df648b4d4/checks?check_suite_id=322323808) in your repository's Actions tab and a [corresponding package](https://github.com/msfjarvis/github-packages-deployment-sample/packages/60429) in the Packages tab once the workflow finishes executing.
|
That's it! Once you push to GitHub, you'll see the [action running](https://github.com/msfjarvis/github-packages-deployment-sample/commit/42e1f6609bf9f2abe8e181296a57d86df648b4d4/checks?check_suite_id=322323808) in your repository's Actions tab and a [corresponding package](https://github.com/msfjarvis/github-packages-deployment-sample/packages/60429) in the Packages tab once the workflow finishes executing.
|
||||||
|
|
||||||
|
|
|
@ -15,19 +15,19 @@ Java:
|
||||||
|
|
||||||
{{< highlight java >}}
|
{{< highlight java >}}
|
||||||
class Person {
|
class Person {
|
||||||
private final String name;
|
private final String name;
|
||||||
|
|
||||||
public Person(String name) {
|
public Person(String name) {
|
||||||
this.name = name;
|
this.name = name;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
{{< / highlight >}}
|
{{< /highlight >}}
|
||||||
|
|
||||||
Kotlin:
|
Kotlin:
|
||||||
|
|
||||||
{{< highlight kotlin >}}
|
{{< highlight kotlin >}}
|
||||||
class Person(val name: String)
|
class Person(val name: String)
|
||||||
{{< / highlight >}}
|
{{< /highlight >}}
|
||||||
|
|
||||||
The benefits of using Kotlin immediately start showing! But let's go over this in a sysmetatic fashion and break down each aspect of what makes Kotlin so great.
|
The benefits of using Kotlin immediately start showing! But let's go over this in a sysmetatic fashion and break down each aspect of what makes Kotlin so great.
|
||||||
|
|
||||||
|
@ -41,13 +41,13 @@ The primary constructor cannot have any code so Kotlin provides something called
|
||||||
|
|
||||||
{{< highlight kotlin >}}
|
{{< highlight kotlin >}}
|
||||||
class Person(val name: String) {
|
class Person(val name: String) {
|
||||||
init {
|
init {
|
||||||
println("Invoking constructor!")
|
println("Invoking constructor!")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
val _ = Person("Matt")
|
val _ = Person("Matt")
|
||||||
{{< / highlight >}}
|
{{< /highlight >}}
|
||||||
|
|
||||||
Moving on, let's add an optional age parameter to our classes, with a default value of 18. To make it convenient to see how different constructors affect values, we're also including an implementation of the `toString` method for some classing print debugging.
|
Moving on, let's add an optional age parameter to our classes, with a default value of 18. To make it convenient to see how different constructors affect values, we're also including an implementation of the `toString` method for some classing print debugging.
|
||||||
|
|
||||||
|
@ -55,35 +55,36 @@ Java:
|
||||||
|
|
||||||
{{< highlight java >}}
|
{{< highlight java >}}
|
||||||
class Person {
|
class Person {
|
||||||
private final String name;
|
|
||||||
private int age = 18;
|
|
||||||
|
|
||||||
public Person(String name) {
|
private final String name;
|
||||||
this.name = name;
|
private int age = 18;
|
||||||
}
|
|
||||||
|
|
||||||
public Person(String name, int age) {
|
public Person(String name) {
|
||||||
this(name);
|
this.name = name;
|
||||||
this.age = age;
|
}
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
public Person(String name, int age) {
|
||||||
public String toString() {
|
this(name);
|
||||||
return "Name=" + name + ",age=" + Integer.toString(age);
|
this.age = age;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString() {
|
||||||
|
return "Name=" + name + ",age=" + Integer.toString(age);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
{{< / highlight >}}
|
{{< /highlight >}}
|
||||||
|
|
||||||
Kotlin:
|
Kotlin:
|
||||||
|
|
||||||
{{< highlight kotlin >}}
|
{{< highlight kotlin >}}
|
||||||
class Person(val name: String, val age: Int = 18) {
|
class Person(val name: String, val age: Int = 18) {
|
||||||
override fun toString() : String {
|
override fun toString() : String {
|
||||||
// I'll go over string templates in a future post, hold me to it :)
|
// I'll go over string templates in a future post, hold me to it :)
|
||||||
return "Name=$name,age=$age"
|
return "Name=$name,age=$age"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
{{< / highlight >}}
|
{{< /highlight >}}
|
||||||
|
|
||||||
Lots of new things here! Let's break them down.
|
Lots of new things here! Let's break them down.
|
||||||
|
|
||||||
|
@ -101,11 +102,11 @@ An important note here is that constructors with default values don't directly w
|
||||||
|
|
||||||
{{< highlight kotlin >}}
|
{{< highlight kotlin >}}
|
||||||
class Person @JvmOverloads constructor(val name: String, val age: Int = 18) {
|
class Person @JvmOverloads constructor(val name: String, val age: Int = 18) {
|
||||||
override fun toString() : String {
|
override fun toString() : String {
|
||||||
return "Name=$name,age=$age"
|
return "Name=$name,age=$age"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
{{< / highlight >}}
|
{{< /highlight >}}
|
||||||
|
|
||||||
Doing this will generate constructors similar to how we previously wrote in Java, to allow both Kotlin and Java callers to work.
|
Doing this will generate constructors similar to how we previously wrote in Java, to allow both Kotlin and Java callers to work.
|
||||||
|
|
||||||
|
@ -117,13 +118,13 @@ Java:
|
||||||
|
|
||||||
{{< highlight java >}}
|
{{< highlight java >}}
|
||||||
public class Man extends Person { /* Class body */ } // Valid in Java
|
public class Man extends Person { /* Class body */ } // Valid in Java
|
||||||
{{< / highlight >}}
|
{{< /highlight >}}
|
||||||
|
|
||||||
Kotlin:
|
Kotlin:
|
||||||
|
|
||||||
{{< highlight kotlin >}}
|
{{< highlight kotlin >}}
|
||||||
class Man(val firstName: String) : Person(firstName) // Errors!
|
class Man(val firstName: String) : Person(firstName) // Errors!
|
||||||
{{< / highlight >}}
|
{{< /highlight >}}
|
||||||
|
|
||||||
Trying it out in the Kotlin REPL
|
Trying it out in the Kotlin REPL
|
||||||
|
|
||||||
|
@ -137,7 +138,7 @@ Trying it out in the Kotlin REPL
|
||||||
error: this type is final, so it cannot be inherited from
|
error: this type is final, so it cannot be inherited from
|
||||||
class Man(val firstName: String) : Person(firstName)
|
class Man(val firstName: String) : Person(firstName)
|
||||||
^
|
^
|
||||||
{{< / highlight >}}
|
{{< /highlight >}}
|
||||||
|
|
||||||
Makes sense, since that's default for Kotlin. Let's add the `open` keyword to our definition of `Person` and try again.
|
Makes sense, since that's default for Kotlin. Let's add the `open` keyword to our definition of `Person` and try again.
|
||||||
|
|
||||||
|
@ -150,7 +151,7 @@ Makes sense, since that's default for Kotlin. Let's add the `open` keyword to ou
|
||||||
>>> class Man(val firstName: String) : Person(firstName)
|
>>> class Man(val firstName: String) : Person(firstName)
|
||||||
>>> println(Man("Henry"))
|
>>> println(Man("Henry"))
|
||||||
Name=Henry,age=18
|
Name=Henry,age=18
|
||||||
{{< / highlight >}}
|
{{< /highlight >}}
|
||||||
|
|
||||||
And everything works as we'd expect it to. This is a behavior change that is confusing and undesirable to a lot of people, so Kotlin provides a compiler plugin to mark all classes as `open` by default. Check out the [`kotlin-allopen`](https://kotlinlang.org/docs/reference/compiler-plugins.html#all-open-compiler-plugin) page for more information about how to configure the plugin for your needs.
|
And everything works as we'd expect it to. This is a behavior change that is confusing and undesirable to a lot of people, so Kotlin provides a compiler plugin to mark all classes as `open` by default. Check out the [`kotlin-allopen`](https://kotlinlang.org/docs/reference/compiler-plugins.html#all-open-compiler-plugin) page for more information about how to configure the plugin for your needs.
|
||||||
|
|
||||||
|
@ -164,20 +165,20 @@ Java:
|
||||||
|
|
||||||
{{< highlight java >}}
|
{{< highlight java >}}
|
||||||
public static final class StringUtils {
|
public static final class StringUtils {
|
||||||
public static String normalizePath(final String str) {
|
public static String normalizePath(final String str) {
|
||||||
return str.replace("/document/primary:", "/sdcard/");
|
return str.replace("/document/primary:", "/sdcard/");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
{{< / highlight >}}
|
{{< /highlight >}}
|
||||||
|
|
||||||
Kotlin:
|
Kotlin:
|
||||||
|
|
||||||
{{< highlight kotlin >}}
|
{{< highlight kotlin >}}
|
||||||
object StringUtils {
|
object StringUtils {
|
||||||
// I'll cover this declaration style too. It's just the first post!
|
// I'll cover this declaration style too. It's just the first post!
|
||||||
fun normalizePath(str: String): String = str.replace("/document/primary:", "/sdcard/")
|
fun normalizePath(str: String): String = str.replace("/document/primary:", "/sdcard/")
|
||||||
}
|
}
|
||||||
{{< / highlight >}}
|
{{< /highlight >}}
|
||||||
|
|
||||||
A recurring pattern with Kotlin is concise code, as you can see in this case.
|
A recurring pattern with Kotlin is concise code, as you can see in this case.
|
||||||
|
|
||||||
|
|
|
@ -11,13 +11,13 @@ Even the variables in Kotlin are supercharged!
|
||||||
|
|
||||||
Let's start with a simple [data class](https://kotlinlang.org/docs/reference/data-classes.html#data-classes) and see how the variables in there behave.
|
Let's start with a simple [data class](https://kotlinlang.org/docs/reference/data-classes.html#data-classes) and see how the variables in there behave.
|
||||||
|
|
||||||
{{< highlight kotlin >}}
|
``` kotlin
|
||||||
data class Student(val name: String, val age: Int, val subjects: ArrayList<String>)
|
data class Student(val name: String, val age: Int, val subjects: ArrayList<String>)
|
||||||
{{< / highlight >}}
|
```
|
||||||
|
|
||||||
To use the variables in this class, Kotlin let's you directly use the dot notation for accessing.
|
To use the variables in this class, Kotlin let's you directly use the dot notation for accessing.
|
||||||
|
|
||||||
{{< highlight kotlin >}}
|
``` kotlin
|
||||||
|
|
||||||
>>> val s1 = Student("Keith Hernandez", 21, arrayListOf("Mathematics", "Social Studies"))
|
>>> val s1 = Student("Keith Hernandez", 21, arrayListOf("Mathematics", "Social Studies"))
|
||||||
>>> println(s1.name)
|
>>> println(s1.name)
|
||||||
|
@ -27,19 +27,19 @@ Keith Hernandez
|
||||||
>>> println(s1) // data classes automatically generate `toString` and `hashCode`
|
>>> println(s1) // data classes automatically generate `toString` and `hashCode`
|
||||||
|
|
||||||
Student(name=Keith Hernandez, age=21, subjects=[Mathematics, Social Studies])
|
Student(name=Keith Hernandez, age=21, subjects=[Mathematics, Social Studies])
|
||||||
{{< / highlight >}}
|
```
|
||||||
|
|
||||||
For Java callers, Kotlin also generates getters and setter methods.
|
For Java callers, Kotlin also generates getters and setter methods.
|
||||||
|
|
||||||
{{< highlight java >}}
|
``` java
|
||||||
final Student s1 = new Student("Keith Hernandez", 21, arrayListOf("Mathematics", "Social Studies"));
|
final Student s1 = new Student("Keith Hernandez", 21, arrayListOf("Mathematics", "Social Studies"));
|
||||||
System.out.println(s1.getName());
|
System.out.println(s1.getName());
|
||||||
System.out.println(s1);
|
System.out.println(s1);
|
||||||
{{< / highlight >}}
|
```
|
||||||
|
|
||||||
The same properties apply to variables in non-data classes as well.
|
The same properties apply to variables in non-data classes as well.
|
||||||
|
|
||||||
{{< highlight kotlin >}}
|
``` kotlin
|
||||||
|
|
||||||
>>> class Item(id: Int, name: String) {
|
>>> class Item(id: Int, name: String) {
|
||||||
|
|
||||||
|
@ -58,7 +58,7 @@ Line_4$Item@46fb460a
|
||||||
|
|
||||||
>> >
|
>> >
|
||||||
|
|
||||||
{{< / highlight >}}
|
```
|
||||||
|
|
||||||
As you can notice, the `toString` implementation is not identical to our data classes but that's a topic for another post. Back to variables!
|
As you can notice, the `toString` implementation is not identical to our data classes but that's a topic for another post. Back to variables!
|
||||||
|
|
||||||
|
@ -66,7 +66,7 @@ As you can notice, the `toString` implementation is not identical to our data cl
|
||||||
|
|
||||||
While Kotlin creates getters and setters automatically, we can customize their behaviour.
|
While Kotlin creates getters and setters automatically, we can customize their behaviour.
|
||||||
|
|
||||||
{{< highlight kotlin >}}
|
``` kotlin
|
||||||
class Item(id: Int, name: String) {
|
class Item(id: Int, name: String) {
|
||||||
var itemId = id
|
var itemId = id
|
||||||
var itemName = name
|
var itemName = name
|
||||||
|
@ -80,18 +80,18 @@ class Item(id: Int, name: String) {
|
||||||
return "id=$itemId,name=$itemName"
|
return "id=$itemId,name=$itemName"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
{{< / highlight >}}
|
```
|
||||||
|
|
||||||
Let's take this for a spin in the Kotlin REPL and see how our `currentState` field behaves.
|
Let's take this for a spin in the Kotlin REPL and see how our `currentState` field behaves.
|
||||||
|
|
||||||
{{< highlight kotlin >}}
|
```kotlin
|
||||||
>>> val item = Item(0, "Nails")
|
>>> val item = Item(0, "Nails")
|
||||||
>>> println(item)
|
>>> println(item)
|
||||||
id=0,name=Nails
|
id=0,name=Nails
|
||||||
>>> item.currentState = Pair(1, "Bricks")
|
>>> item.currentState = Pair(1, "Bricks")
|
||||||
>>> println(item)
|
>>> println(item)
|
||||||
id=1,name=Bricks
|
id=1,name=Bricks
|
||||||
{{< / highlight >}}
|
```
|
||||||
|
|
||||||
Notice how setting a new value to currentState mutates the other variables as well? That's because of our custom setter. These setters are identical to a normal top-level function except a reference to the field in question is available as the variable `field` for manipulation.
|
Notice how setting a new value to currentState mutates the other variables as well? That's because of our custom setter. These setters are identical to a normal top-level function except a reference to the field in question is available as the variable `field` for manipulation.
|
||||||
|
|
||||||
|
@ -103,7 +103,7 @@ Kotlin's visiblity modifiers aren't very well explained. There's the standard `p
|
||||||
|
|
||||||
`inner` is a modifier that only applies to classes declared within another one. It allows you to access members of the enclosing class. A sample might help explain this better.
|
`inner` is a modifier that only applies to classes declared within another one. It allows you to access members of the enclosing class. A sample might help explain this better.
|
||||||
|
|
||||||
{{< highlight kotlin >}}
|
```kotlin
|
||||||
class Outer {
|
class Outer {
|
||||||
private val bar: Int = 1
|
private val bar: Int = 1
|
||||||
inner class Inner {
|
inner class Inner {
|
||||||
|
@ -112,7 +112,7 @@ class Outer {
|
||||||
}
|
}
|
||||||
|
|
||||||
val demo = Outer().Inner().foo() // == 1
|
val demo = Outer().Inner().foo() // == 1
|
||||||
{{< / highlight >}}
|
```
|
||||||
|
|
||||||
The keyword `this` does not behave as some would normally expect in inner classes, go through the Kotlin documentation for `this` [here](https://kotlinlang.org/docs/reference/this-expressions.html) and I'll be happy to answer any further questions :)
|
The keyword `this` does not behave as some would normally expect in inner classes, go through the Kotlin documentation for `this` [here](https://kotlinlang.org/docs/reference/this-expressions.html) and I'll be happy to answer any further questions :)
|
||||||
|
|
||||||
|
|
|
@ -24,7 +24,7 @@ Gradle doesn't seem to have invested any actual time in converting the original
|
||||||
|
|
||||||
Groovy
|
Groovy
|
||||||
|
|
||||||
{{< highlight groovy >}}
|
```groovy
|
||||||
android {
|
android {
|
||||||
compileSdkVersion 29
|
compileSdkVersion 29
|
||||||
buildToolsVersion = '29.0.2'
|
buildToolsVersion = '29.0.2'
|
||||||
|
@ -42,11 +42,11 @@ dependencies {
|
||||||
force = true
|
force = true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
{{< / highlight >}}
|
```
|
||||||
|
|
||||||
Kotlin
|
Kotlin
|
||||||
|
|
||||||
{{< highlight groovy >}}
|
```groovy
|
||||||
android {
|
android {
|
||||||
compileSdkVersion(29)
|
compileSdkVersion(29)
|
||||||
buildToolsVersion = "29.0.2"
|
buildToolsVersion = "29.0.2"
|
||||||
|
@ -64,13 +64,13 @@ dependencies {
|
||||||
isForce = true
|
isForce = true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
{{< / highlight >}}
|
```
|
||||||
|
|
||||||
I am definitely biased here, but this is not how an idiomatic Kotlin API looks like.
|
I am definitely biased here, but this is not how an idiomatic Kotlin API looks like.
|
||||||
|
|
||||||
What we should have gotten
|
What we should have gotten
|
||||||
|
|
||||||
{{< highlight groovy >}}
|
```groovy
|
||||||
android {
|
android {
|
||||||
compileSdkVersion = 29
|
compileSdkVersion = 29
|
||||||
buildToolsVersion = "29.0.2"
|
buildToolsVersion = "29.0.2"
|
||||||
|
@ -89,7 +89,7 @@ dependencies {
|
||||||
force = true
|
force = true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
{{< / highlight >}}
|
```
|
||||||
|
|
||||||
Property access syntax and discoverable variable names should have been the norm since day one for it to actually be a good Kotlin DSL.
|
Property access syntax and discoverable variable names should have been the norm since day one for it to actually be a good Kotlin DSL.
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user