Menu
Coddy logo textTech

オブジェクトの減算

CoddyのLuaジャーニー「オブジェクト指向プログラミング」セクションの一部。レッスン 27/70。

__add+ operator を処理するのと同じように、__sub metamethod は - operator の動作を定義します。パターンは同一です。2つの operands を receives し、新しい object を返す function を定義します。

local Color = {}
Color.__index = Color

function Color:new(r, g, b)
    local obj = {r = r, g = g, b = b}
    setmetatable(obj, Color)
    return obj
end

function Color.__sub(c1, c2)
    return Color:new(c1.r - c2.r, c1.g - c2.g, c1.b - c2.b)
end

RGBカラーを扱う場合、減算によって負の値が生じることがあります。実際のアプリケーションでは、結果を有効な範囲(0-255)に収めたい場合がありますが、基本的なメタメソッドの構造は同じままです。

local bright = Color:new(200, 150, 100)
local dim = Color:new(50, 30, 20)
local result = bright - dim

print(result.r, result.g, result.b)  -- 出力: 150  120  80

Remember: __sub は、Lua が両方の operands を引数として直接呼び出すメタメソッドなので、コロンではなくドットで定義します。

challenge icon

チャレンジ

簡単

Color クラスを構築し、- operator を使用した減算をサポートしましょう。色は RGB 値で表され、ある色から別の色を減算すると、各 componentdifference を持つ新しい色が作成されます。

コードを 2 つのファイルに分けて整理します。

  • Color.lua: 赤、緑、青の値を表す rgb components を持つ Color クラスを Define します。:new(r, g, b) constructor を含め、2 つの色を減算すると component ごとの差を持つ新しい色が作成されるように __sub metamethod を Implement します。__sub はドット構文を使用し、両方の operands を引数として receives することを Remember してください。
  • main.lua: Color module を Require し、provided inputs から color instances を create して減算し、resulting RGB values を表示します。

6 つの inputs を受け取ります。

  1. First color の red component
  2. First color の green component
  3. First color の blue component
  4. Second color の red component
  5. Second color の green component
  6. Second color の blue component

main file で、given RGB values を使用して 2 つの colors を create し、- operator を使用して second color を first color から減算し、resulting color の rgb values を separate lines に print します。

たとえば、inputs が 200150100503020 の場合、Output は次のようになります。

150
120
80

First color (200, 150, 100) から second color (50, 30, 20) を減算すると、新しい color (150, 120, 80) になります。

REQUIRED OUTPUT FORMAT: [Your translated content here]

自分で試してみよう

-- Colorモジュールを読み込む
local Color = require('Color')

-- 入力値を読み取る
local r1 = tonumber(io.read())
local g1 = tonumber(io.read())
local b1 = tonumber(io.read())
local r2 = tonumber(io.read())
local g2 = tonumber(io.read())
local b2 = tonumber(io.read())

-- TODO: 指定されたRGB値で2つのColorインスタンスを作成する

-- TODO: -演算子を使って1つ目の色から2つ目の色を減算する

-- TODO: 結果の色のr、g、bの値を別々の行に出力する
quiz icon腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

オブジェクト指向プログラミングのすべてのレッスン

自分で練習してみよう: Luaオンラインコンパイラ