オブジェクトの減算
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)
endRGBカラーを扱う場合、減算によって負の値が生じることがあります。実際のアプリケーションでは、結果を有効な範囲(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 80Remember: __sub は、Lua が両方の operands を引数として直接呼び出すメタメソッドなので、コロンではなくドットで定義します。
チャレンジ
簡単Color クラスを構築し、- operator を使用した減算をサポートしましょう。色は RGB 値で表され、ある色から別の色を減算すると、各 component の difference を持つ新しい色が作成されます。
コードを 2 つのファイルに分けて整理します。
Color.lua: 赤、緑、青の値を表すr、g、bcomponentsを持つ Color クラスをDefineします。:new(r, g, b)constructorを含め、2 つの色を減算するとcomponentごとの差を持つ新しい色が作成されるように__submetamethod を Implement します。__subはドット構文を使用し、両方の operands を引数として receives することを Remember してください。main.lua: Color module を Require し、provided inputs から color instances を create して減算し、resulting RGB values を表示します。
6 つの inputs を受け取ります。
- First color の red component
- First color の green component
- First color の blue component
- Second color の red component
- Second color の green component
- Second color の blue component
main file で、given RGB values を使用して 2 つの colors を create し、- operator を使用して second color を first color から減算し、resulting color の r、g、b values を separate lines に print します。
たとえば、inputs が 200、150、100、50、30、20 の場合、Output は次のようになります。
150
120
80First color (200, 150, 100) から second color (50, 30, 20) を減算すると、新しい color (150, 120, 80) になります。
REQUIRED OUTPUT FORMAT:自分で試してみよう
-- 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の値を別々の行に出力する
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
オブジェクト指向プログラミングのすべてのレッスン
自分で練習してみよう: Luaオンラインコンパイラ